将UIButtons添加为子视图时,UIScrollView不会滚动

时间:2013-10-06 19:41:48

标签: ios uiscrollview

我正在尝试使用分页构建一个简单的UIScrollView,以在3个图像之间水平滚动。 棘手的部分是我希望每个图像都可以点击并捕获点击事件。

我的技术是创建3个UIButton,每个UIButtons都包含UIImage。给每个按钮一个标签并设置一个动作。

问题:我可以捕获点击事件 - 它不可滚动!

这是我的代码:

- (void) viewDidAppear:(BOOL)animated {

    _imageArray = [[NSArray alloc] initWithObjects:@"content_01.png", @"content_02.png", @"content_03.png", nil];

    for (int i = 0; i < [_imageArray count]; i++) {
        //We'll create an imageView object in every 'page' of our scrollView.
        CGRect frame;
        frame.origin.x = _contentScrollView.frame.size.width * i;
        frame.origin.y = 0;
        frame.size = _contentScrollView.frame.size;

        //
        //get the image to use, however you want
        UIImage* image = [UIImage imageNamed:[_imageArray objectAtIndex:i]];

        UIButton* button = [[UIButton alloc] initWithFrame:frame];

        //set the button states you want the image to show up for
        [button setImage:image forState:UIControlStateNormal];
        [button setImage:image forState:UIControlStateHighlighted];

        //create the touch event target, i am calling the 'productImagePressed' method
        [button addTarget:self action:@selector(imagePressed:)
         forControlEvents:UIControlEventTouchUpInside];
        //i set the tag to the image #, i was looking though an array of them
        button.tag = i;

        [_contentScrollView addSubview:button];
    }

    //Set the content size of our scrollview according to the total width of our imageView objects.
    _contentScrollView.contentSize = CGSizeMake(_contentScrollView.frame.size.width * [_imageArray count], _contentScrollView.frame.size.height);

    _contentScrollView.backgroundColor = [ENGAppDelegate backgroundColor];
    _contentScrollView.delegate = self;
}

1 个答案:

答案 0 :(得分:1)

好吧,因为UIButton是一个UIControl子类,它会“吃掉”滚动视图的触摸:

  

[UIScrollView touchesShouldCancelInContentView:]如果view不是UIControl对象,则默认返回值为YES;否则,它返回NO。

(来自https://developer.apple.com/library/ios/documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/instm/UIScrollView/touchesShouldCancelInContentView:)

可以通过继承UIScrollView并覆盖touchesShouldCancelInContentView:(和/或touchesShouldBegin:withEvent:inContentView:)来影响这一点。但是,对于您的用例,我首先不使用按钮。为什么不在滚动视图中添加点击手势识别器并使用触摸点来确定已点击的图像?这更容易,应该没有任何问题。