UIButton's image scrolling with scrollview but

2019-03-06 11:17发布

问题:

I have a UIScrollView that scrolls automatically, and I create several buttons using initWithFrame, each with an image and an unique action(method) and add them all to the scroll view. The buttons' images can be scrolling automatically with the scroll view but when I click on each button, it's not the method I assigned to that button. When I click on the same position, no matter which buttons pass by, it goes to the same method instead of the method of that button. Below is my code for creating the buttons:

for (int i = 0; i < 4; i++) {
        //create an imageView object in every 'page' of the scrollView.
        CGRect frame;
        frame.origin.x = 62 * i;
        frame.origin.y = 0;
        frame.size = CGSizeMake(52.0, 52.0);
        myButton = [[UIButton alloc] initWithFrame:frame];
        [myButton setImage:[MyImageArray objectAtIndex:i] forState:normal];
            switch (i) {
                case 0:
                    [myButton addTarget:self action:@selector(aMethod0) forControlEvents:UIControlEventTouchUpInside];
                    break;
                case 1:
                    [myButton addTarget:self action:@selector(aMethod1) forControlEvents:UIControlEventTouchUpInside];
                    break;
                case 2:
                    [myButton addTarget:self action:@selector(aMethod2) forControlEvents:UIControlEventTouchUpInside];
                    break;
                case 3:
                    [myButton addTarget:self action:@selector(aMethod3) forControlEvents:UIControlEventTouchUpInside];
                    break;
                default:
                    break;
            }
        [self.MyScrollView addSubview:myButton];

Below is the code for the automatically scroll the scrollview:

- (void)move_pagination {

    UIPageControl *pgCtr = MyPageControl;

    CGFloat contentOffset = MyScrollView.contentOffset.x;
    __block int  nextPage = (int)(contentOffset/(MyScrollView.frame.size.width+10)) + 1 ;

    [UIView animateWithDuration:10
                          delay:0
                        options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         if( nextPage!=3 )  {
                             MyScrollView.contentOffset = CGPointMake(nextPage*(10+MyScrollView.frame.size.width), 0);
                             pgCtr.currentPage=nextPage;
                             // else start sliding from 1 :)
                         } else {
                             nextPage = 1;
                             MyScrollView.contentOffset = CGPointMake(0, 0);
                             MyScrollView.contentOffset = CGPointMake(nextPage*(10+MyScrollView.frame.size.width), 0);
                             pgCtr.currentPage=2;
                         }

                     }
                     completion:nil];
}

Any clues why this strange behaviour happens?? Thanks.

回答1:

try this code..

in your view did load method

 float x=62;
    for(int i=0;i<4;i++)
    {
        self.stack=[UIButton buttonWithType:UIButtonTypeCustom];
        self.stack.frame=CGRectMake(x+(62*i), 100, 52, 52);
        [self.stack setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [self.stack setTitle:[self.titleName objectAtIndex:i] forState:UIControlStateNormal];
        [self.stack setBackgroundColor:[UIColor redColor]];
        self.stack.tag=i;
        [self.stack addTarget:self action:@selector(actionMethod:) forControlEvents:UIControlEventTouchUpInside];
        //your scroll view
        //[self.scrView addSubview:self.btnlabe1];
        [self.view addSubview:self.stack];
    }

and create method like this...

-(void)actionMethod:(id)sender
{
    UIButton *button=(UIButton *)sender;
    switch (button.tag) {

            case 0:
            NSLog(@"ACTIONMETHOD CODE HERE");
            break;
        case 1:
            NSLog(@"ACTIONMETHOD1 CODE HERE");
            break;
        case 2:
            NSLog(@"ACTIONMETHOD2 CODE HERE");
            break;
        case 3:
            NSLog(@"ACTIONMETHOD3 CODE HERE");
            break;

        default:
            break;
    }
}

edited code

float x=62;
    for(int i=0;i<4;i++)
    {
        self.stack=[UIButton buttonWithType:UIButtonTypeCustom];
        self.stack.frame=CGRectMake(x+(62*i), 100, 52, 52);
        [self.stack setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [self.stack setTitle:[temp objectAtIndex:i] forState:UIControlStateNormal];
        [self.stack setBackgroundColor:[UIColor redColor]];
        switch (i) {
            case 0:
                [self.stack addTarget:self action:@selector(aMethod0) forControlEvents:UIControlEventTouchUpInside];
                break;
            case 1:
                [self.stack addTarget:self action:@selector(aMethod1) forControlEvents:UIControlEventTouchUpInside];
                break;
            case 2:
                [self.stack addTarget:self action:@selector(aMethod2) forControlEvents:UIControlEventTouchUpInside];
                break;
            case 3:
                [self.stack addTarget:self action:@selector(aMethod3) forControlEvents:UIControlEventTouchUpInside];
                break;
            default:
                break;
        }        //your scroll view
        //[self.scrView addSubview:self.stack];
        [self.view addSubview:self.stack];
    }

and methods

-(void)aMethod0
{
    NSLog(@"action 0");

}
-(void)aMethod1
{
    NSLog(@"action 1");

}
-(void)aMethod2
{
    NSLog(@"action 2");

}
-(void)aMethod3
{
    NSLog(@"action 3");

}