views:

353

answers:

1

Hi all, I have a problem with adding a set of UIButtons to a UIScrollView. With the buttons added it seems that the scroll command is not being passed to the scroll view as the buttons cover the whole surface. I've read various posts on this but still can't figure it out. I'm pretty new to iPhone programming so there's probably something obvious I've missed. I've tried things like canCancelContentTouches and delaysContentTouches to TRUE and FALSE.

Here is the code I use to add the buttons to the scrollview. The scrollview was created in IB and is passed in to the function:

-(void)drawCharacters:(NSMutableArray *)chars:(UIScrollView *)target_view {
//NSLog(@"CLEARING PREVIOUS BUTTONS");
//clear previous buttons for parts/kanji
if(target_view == viewParts){
    for (UIButton *btn in parts_buttons) {
        [btn removeFromSuperview];
    }
    [parts_buttons removeAllObjects];
} else if(target_view == viewKanji){
    for (UIButton *btn in kanji_buttons) {
        [btn removeFromSuperview];
    }
    [kanji_buttons removeAllObjects];
}
//display options
int chars_per_line = 9; //change this to change the number of chars displayed on each line
if(target_view == viewKanji){
    chars_per_line = 8;
}
int char_gap = 0; //change this to change the margin between chars
int char_dimensions = (320/chars_per_line)-(char_gap*2);
//set starting x, y coords
int x = 0, y = 0;
//increment y coord
y += char_gap;
//NSLog(@"ABOUT TO DRAW FIRST BUTTON");
for(NSMutableArray *char_arr in chars){
    //increment x coord
    x += char_gap;
    //draw at x and y
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
    myButton.frame = CGRectMake(x, y, char_dimensions, char_dimensions); // position in the parent view and set the size of the button
    [myButton setTitle:[char_arr objectAtIndex:0] forState:UIControlStateNormal];
    [myButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
    [myButton setTitleColor:[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1.0] forState:UIControlStateDisabled];
    myButton.titleLabel.font = [UIFont boldSystemFontOfSize:22];
    if(target_view == viewKanji){
        myButton.titleLabel.font = [UIFont boldSystemFontOfSize:30];
    }
    // add targets and actions
    if(target_view == viewParts){
        [myButton addTarget:self action:@selector(partSelected:) forControlEvents:UIControlEventTouchUpInside];
    } else if(target_view == viewKanji){
        [myButton addTarget:self action:@selector(kanjiSelected:) forControlEvents:UIControlEventTouchUpInside];
        [myButton setTag:(int)[char_arr objectAtIndex:1]];
    }

    //if the part isnt in the current list of kanji, disable and dim it
    if(target_view == viewParts){
        if([kanji count] > 0){
            [myButton setEnabled:NO];
        }
        bool do_break = NO;
        for(NSMutableArray *arr in kanji){
            //NSLog([NSString stringWithFormat:@"CHECKING PARTS AGAINST %d KANJI", [kanji count]]);
            for(NSString *str in [[arr objectAtIndex:2] componentsSeparatedByString:@" "]){
                if(([myButton.titleLabel.text isEqualToString:str])){
                    //NSLog(@"--------------MATCH!!!-----------------");
                    [myButton setEnabled:YES];
                    for(NSString *str1 in parts_selected){
                        if(([myButton.titleLabel.text isEqualToString:str1])){
                            [myButton setEnabled:NO];
                            break;
                        }
                    }
                    do_break = YES;
                    break;
                }
                if(do_break) break;
            }
            if(do_break) break;
        }
    }
    // add to a view
    [target_view addSubview:myButton];
    //update coords of next button
    x += char_dimensions+ char_gap;
    if (x > (320-char_dimensions)) {
        x = 0;
        y += char_dimensions + (char_gap*2);
    }
    //add button to global array to be removed from view next update
    if(target_view == viewParts){
        [parts_buttons addObject:myButton];
    } else if(target_view == viewKanji){
        [kanji_buttons addObject:myButton];
    }
}
//NSLog(@"FINISHED DRAWING ALL BUTTONS");

}

Any help on this would be greatly appreciated. I just need to fix this to finish my app.

A: 

You cannot expect the scrollview to receive events if the buttons cover the whole surface.(They are going to be first in the responder chain). The quick fix would be to make the buttons slightly smaller than the scrollview.

On first read of this problem I was thinking that you wanted to add buttons to the scrollview's superview -- but then I realized you actually want the buttons in the scrollview.

David Sowsy
OK, silly me, I worked it out. I didn't realize that I needed to set an internal size for the scroll view. Once I'd done that it was working no problems. Basically I used:target_view.contentSize = CGSizeMake(target_view.frame.size.width, the_coords_of_my_last_button+height);Thanks for your reply David.
Mark McFarlane