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

Posted

技术标签:

【中文标题】将 UIButtons 添加为子视图时 UIScrollView 不滚动【英文标题】:UIScrollView not scrolling when adding UIButtons as subviews 【发布时间】:2013-10-06 19:41:48 【问题描述】:

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

我的技术是创建 3 个 UIButton,每个都包含 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;

【问题讨论】:

您是否已单步执行您的代码以确保 _contentScrollView.contentSize 符合您的预期?我认为此时 _contentScrollView.frame.size 计算不正确,因此您不会获得良好的价值。 我查过,计算正确!让我这样说:如果我在没有框架的情况下初始化按钮(所以没有显示图片),那么我会看到它滚动! 是否有可能如果我将按钮框架设置为与 ScrollView 一样的确切大小,那么它会完全阻止滚动,所以我没有得到滚动事件?? 这对我来说似乎很奇怪。滚动视图根本不应该关心它的一个孩子的框架。 计算结束时的 _contentScrollView.frame 是什么?您是否碰巧将其设置为与内容一样大,而不仅仅是屏幕尺寸? 【参考方案1】:

好吧,既然UIButtonUIControl 的子类,它会“吃掉”滚动视图的触摸:

[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:)来影响这一点。但是,对于您的用例,我首先不会使用按钮。为什么不直接在滚动视图中添加一个点击手势识别器并使用触摸点来确定哪个图像被点击了呢?这要容易得多,而且应该可以毫无问题地工作。

【讨论】:

以上是关于将 UIButtons 添加为子视图时 UIScrollView 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

当视图未将自身添加到其子视图时,“无法将自身添加为子视图”崩溃(带有示例代码)

尝试添加为子视图时,ScrollView 不起作用

UIButton 的 title 属性正确记录但在将按钮添加为子视图时未显示

使用自动布局的 xib 添加为子视图时不显示

将 UIButton 添加到 UICollectionView 标头

将 UIImagePickerController 添加为子视图