添加到 UIScrollView 时 UIButton 不滚动

Posted

技术标签:

【中文标题】添加到 UIScrollView 时 UIButton 不滚动【英文标题】:UIButton does not scroll when adding to UIScrollView 【发布时间】:2015-05-05 15:50:54 【问题描述】:

我已将UIButtonUILabel 添加到UIScrollView。我使用自动布局向按钮添加了两个约束,而对标签则没有。我可以看到标签在屏幕上移动,但是我没有看到按钮在移动。我认为这与我添加到按钮的自动布局约束有关。我希望看到按钮滚动的方式与我看到标签在窗口/屏幕上滚动的方式相同。

以下是我如何设置所有内容:

_welcomeScroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
_welcomeScroller.userInteractionEnabled = YES;
_welcomeScroller.scrollEnabled = YES;
_welcomeScroller.showsHorizontalScrollIndicator = YES;
_welcomeScroller.showsVerticalScrollIndicator = YES;
#ifdef DEBUG
[_welcomeScroller setBackgroundColor:[UIColor greenColor]];
#endif
[self.view addSubview:_welcomeScroller];
CGSize welcomeScrollerSize = CGSizeMake(2000, 2000);
[_welcomeScroller setContentSize:welcomeScrollerSize];

// add test label
_test = [[UILabel alloc] initWithFrame:CGRectMake(200, 200, 200, 200)];
[_test setText:@"TEST"];
[_test setFont:[UIFont systemFontOfSize:44]];
[_test setBackgroundColor:[UIColor redColor]];
[_welcomeScroller addSubview:_test];

// add about btn to lower right
_welcomeAbout = [UIButton buttonWithType:UIButtonTypeInfoDark];
[_welcomeAbout addTarget:self action:@selector(showAboutScreen:) forControlEvents:UIControlEventTouchUpInside];
[_welcomeAbout setTranslatesAutoresizingMaskIntoConstraints:NO];
[_welcomeScroller addSubview:_welcomeAbout];

NSLayoutConstraint *pullToBottom = [NSLayoutConstraint constraintWithItem:_welcomeAbout attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_welcomeScroller.superview attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-10.0];

NSLayoutConstraint *pullToRight = [NSLayoutConstraint constraintWithItem:_welcomeAbout attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:_welcomeScroller.superview attribute:NSLayoutAttributeRight multiplier:1.0 constant:-10];

[_welcomeScroller.superview addConstraints:@[pullToBottom, pullToRight]];

【问题讨论】:

【参考方案1】:

From Apple's technical note:

一般来说,自动布局会考虑顶部、左侧、底部和右侧 视图的边缘成为可见边缘。也就是说,如果您将视图固定到 它的超级视图的左边缘,你真的把它固定在 超级视图边界的最小 x 值。更改边界原点 父视图的位置不会改变视图的位置。

UIScrollView 类通过更改原点来滚动其内容 它的界限。为了使这项工作与自动布局一起使用,顶部、左侧、底部、 滚动视图中的右边缘现在意味着其内容的边缘 查看。

按钮不滚动,因为约束是相对于滚动视图的可见左边缘设置的。

苹果的解决方案建议:

为您的滚动视图创建一个普通的 UIView 内容视图 您希望内容具有的大小。使其成为 滚动视图,但让它继续翻译自动调整大小的掩码 进入约束。

在此内容视图中,您可以像往常一样使用约束。

【讨论】:

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

将 XIB 的 UIScrollView 添加到视图时设置 contentSize

仅在可见时向 UIScrollView 添加视图

将 IBAction 添加到 UIScrollView

如何将 UILabel 添加到 UIScrollView?

如何将多个视图添加到 UIScrollView

无法将 UIButton 添加到 UIScrollView