滚动 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?

UIWebView 的 UIScrollView 子视图可以滚动但会弹回框架而不出现垂直滚动指示器

如何保持 UIscrollview 框架固定但动态范围