如何使 UIScrollView 在 NSLayoutConstraint 中适合其父框架?

Posted

技术标签:

【中文标题】如何使 UIScrollView 在 NSLayoutConstraint 中适合其父框架?【英文标题】:How do I make UIScrollView fit its parent frame in NSLayoutConstraint? 【发布时间】:2015-12-15 08:47:39 【问题描述】:

我在 xib 文件中创建了一个UIScrollView,里面有一些子视图和约束。

然后务实地将其添加到视图中。

    NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil];
self.scrollView = arr[0];
[self.view addSubview:self.scrollView];

self.scrollView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);

scrollView 确实添加到了视图中,但是它的 frame 或 contentSize 总是错误的,我尝试重置它的 contentSize 但没有用。

它总是可以水平滚动。我希望它像UIView 一样调整大小以适合其父框架,希望有人可以帮助我解决它。

【问题讨论】:

如果您不想在开始时或一直显示滚动视图,可以在 xib 中添加约束并使用 show hide。 其实我想把scrollView当作一个像backgroundView一样的画布,因为它的subView的高度可能超出屏幕高度,我希望它可以垂直滚动但水平我希望它可以适应它的superview的宽度和严格遵守 uiscrollView 的约束。 好的,如果这里不起作用,请尝试@Jorn 的回答 不起作用,我尝试在四个方向上添加 4 个约束。没用。 【参考方案1】:

如果您不想使用情节提要,可以通过编程方式为前导、尾随、顶部和底部添加约束:

[self.view addSubview:self.scrollView];

self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[scrollview]-|" options:0 metrics:nil views:@@"scrollview":self.scrollView]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[scrollview]-|" options:0 metrics:nil views:@@"scrollview":self.scrollView]];

[self.view updateConstraints];
[self.view layoutIfNeeded];

【讨论】:

不起作用,我尝试添加顶部、前导、训练、底部约束,似乎滚动视图将适合其子视图的框架。但是如果你把 scrollView 改成 uiview 就完美了。【参考方案2】:

覆盖以下方法并在其中添加您的滚动视图或更新框架。当所有约束都应用于视图时调用此方法。

-(void)viewDidLayoutSubviews
     [super viewDidLayoutSubviews];

为防止滚动设置该方向的内容大小为 0。例如

[scrollview setContentSize:CGSizeMake(500,0)];

这将只允许水平滚动。

【讨论】:

如果我只设置 contentSize,它不会滚动,但 scrollView 不适合其父视图,。如果我同时重置了uiscrollView的frame和contentSize,它就可以滚动了。 帧重置是强制性的,但内容大小只是为了防止一侧,如果你想要两侧你根本不需要设置。我分别回答这两个问题,因为内容大小用于滚动,框架用于在父视图中显示 我想让scrollView适合superView的框架,并严格遵循它的subView的约束。 只需要在superview中添加即可,设置frame correclty不需要约束。 对,但是如果它是一个滚动视图,那么它的子视图将不适合屏幕。那就是问题所在。我希望 scrollView 像 uiview 一样适合屏幕,但实际上,它的一些子视图位于屏幕外部,我确信约束是正确的,当我将 uiscrollView 更改为 UIView 的子类时,一切都是正确的。跨度>

以上是关于如何使 UIScrollView 在 NSLayoutConstraint 中适合其父框架?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UISwipeGestureRecognizer 在 UIScrollView 中工作

如何使 UIScrollView 在 NSLayoutConstraint 中适合其父框架?

如何使按钮在 UIScrollView 内滚动?

如果我在 UIScrollView 中有 UIViewController,如何以编程方式使 UIScrollview zoomToRect?

如何使 UIScrollView 缩放到 UIImage 的大小?

如何以编程方式使用 UIScrollView 使 UIStackView 滚动?