滚动 UIScrollView 会更改其子视图框架
Posted
技术标签:
【中文标题】滚动 UIScrollView 会更改其子视图框架【英文标题】:Scrolling a UIScrollView changes its subviews frames 【发布时间】:2014-02-11 06:18:32 【问题描述】:我的应用使用故事板和自动布局。在视图控制器中,我创建了一个UIScrollView
并添加了三个子视图。
在运行时,我需要更改子视图的大小并重新排列它们。最初,我将它们重新排列在viewDidLayoutSubviews
中,它似乎可以工作,直到我滚动滚动视图。然后将子视图帧改回 IB 中设置的大小。 (在重新排列视图并删除所有 UIViewConstraints
时,我正在设置 UIScrollView
的内容大小。)
【问题讨论】:
如果您需要在运行时更改帧。 yoiu 需要为该视图控制器禁用“自动布局” 【参考方案1】:框架和Auto Layout
不能一起使用,如果您使用的是Auto Layout
,则需要重新排列约束,而不是框架。在使用Auto Layout
时,更改框架会导致一些奇怪的效果,最终会恢复到您在原始UIView
中创建的约束。
一些解决方案:
-
您可以像创建视图一样为每个约束创建一个出口,并在需要时更改其常量。
如果您使用的是 xib,则可以在该特定 xib 中禁用
Auto Layout
。
【讨论】:
第一个解决方案有效,几乎没有约束 + IBOutlet 的约束很少帮助我做我需要的事情,感谢您的快速回答。【参考方案2】:我正在使用自动布局。并正常工作。我有一个 uiscrollview,它包含 3-4 个图像。这取决于有多少图像。当我尝试制作全屏当前图像时,我正在使用一个功能,希望它可以工作。它像这样:
-(void) growImg
if (self.growImgNeed)
self.Scroller.frame=CGRectMake(0, 100, 320, 376);
CGRect ViewSize = Scroller.bounds;
for(int i=0;i< Scroller.subviews.count;i++)
[[self.Scroller.subviews objectAtIndex:i] setSize:CGSizeMake(320, 376)];
[[self.Scroller.subviews objectAtIndex:i] setFrame:ViewSize];
ViewSize = CGRectOffset(ViewSize, Scroller.bounds.size.width, 0);
Scroller.contentSize = CGSizeMake((Scroller.subviews.count) * Scroller.bounds.size.width, Scroller.bounds.size.height);
self.growImgNeed=false;
else
self.Scroller.frame=CGRectMake(80, 82, 160, 188);
CGRect ViewSize = Scroller.bounds;
for(int i=0;i< Scroller.subviews.count;i++)
[[self.Scroller.subviews objectAtIndex:i] setSize:CGSizeMake(160, 188)];
[[self.Scroller.subviews objectAtIndex:i] setFrame:ViewSize];
ViewSize = CGRectOffset(ViewSize, Scroller.bounds.size.width, 0);
Scroller.contentSize = CGSizeMake((Scroller.subviews.count) * Scroller.bounds.size.width, Scroller.bounds.size.height);
self.growImgNeed=true;
【讨论】:
以上是关于滚动 UIScrollView 会更改其子视图框架的主要内容,如果未能解决你的问题,请参考以下文章
UIView(放置在滚动视图内)在以编程方式更改高度常量时不显示其子视图
UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)
以编程方式布局 UIScrollView,并为其子视图添加了自动布局,但它不滚动
滚动其子uiscrollview时如何防止滚动uiscrollview?