如何配置UIScrollView内容大小以具有固定宽度和动态高度?

时间:2014-01-13 17:16:20

标签: ios uiscrollview autolayout

我有一个UIScrollView包含在另一个容器视图中,其约束设置为占用容器视图的所有空间。也就是说我在滚动视图中没有固定的宽度或高度 在我的滚动视图中,我以编程方式添加子视图。每个子视图(内容视图)都是从xib加载的 在xib中,我将任意大小设置为根视图(500x500),但我希望视图宽度自动调整为滚动视图宽度(滚动视图宽度为容器宽度)。
我不希望用户能够水平滚动。

我尝试了不同的解决方案,导致滚动视图可以水平滚动 我试图将内容视图拥抱和压缩属性调整为水平轴上的不同值,但没有成功。

我不想在我的视图上设置固定宽度,因为我希望它们采用容器视图的宽度。

如果您有任何建议,请提前致谢。

3 个答案:

答案 0 :(得分:3)

当时我想出的答案是迟到的 当我使用Autolayout时,VChemezov的回答并不令人满意。

我的内容视图有一组顶部,底部,前导,宽度约束。 (宽度而不是尾随,这是我首先做的,但它没有工作)。

所以现在我有这样的事情:

        NSLayoutConstraint *leading = [NSLayoutConstraint
                                       constraintWithItem:messageView
                                       attribute:NSLayoutAttributeLeading
                                       relatedBy:NSLayoutRelationEqual
                                       toItem:self.conversationScrollView
                                       attribute:NSLayoutAttributeLeading
                                       multiplier:1.0f
                                       constant:0.0f];
        NSLayoutConstraint *width = [NSLayoutConstraint
                                        constraintWithItem:messageView
                                        attribute:NSLayoutAttributeWidth
                                        relatedBy:NSLayoutRelationEqual
                                        toItem:self.conversationScrollView
                                        attribute:NSLayoutAttributeWidth
                                        multiplier:1.0f
                                        constant:0.0f];
        [self.conversationScrollView addConstraints:@[ top, leading, width ]]; 

内容视图的宽度等于滚动视图的宽度。

答案 1 :(得分:2)

Autolayout不会调整UIScrolView中的视图大小。您应该自己布局和调整此视图的大小。有两种基本解决方案:

  • 在将子视图添加到UIScrollView
  • 之前显式设置子视图的宽度
  • 子类UIScrollView并覆盖 setFrame layoutSubviews ,就像这样

    @implementation MyScrollView
    
    - (void)setFrame:(CGRect)frame{
        [super setFrame:frame];
        [self setNeedsLayout];
    }
    
    - (void)layoutSubviews{
        [super layoutSubviews];
        NSArray * subviews=self.subviews;
        for(UIView * view in subviews){
            CGRect viewFrame=view.frame;
            viewFrame.size.width=self.bounds.size.width;
            view.frame=viewFrame;
        }
    }
    
    @end
    

答案 2 :(得分:1)

使用SnapKit它甚至更快:

let helper = UIView()
scrollView.addSubview(helper)

helper.snp.makeConstraints { make in
    make.width.equalTo(snp.width)
    make.leading.trailing.top.equalToSuperview()
    make.height.equalTo(0)
}