UIButtons in UIScrollView stop it scrolling, how to fix?

Posted by Mark McFarlane on Stack Overflow See other posts from Stack Overflow or by Mark McFarlane
Published on 2010-02-09T01:36:26Z Indexed on 2010/03/13 0:07 UTC
Read the original article Hit count: 475

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.

© Stack Overflow or respective owner

Related posts about uiscrollview

Related posts about uibutton