2014-01-13 130 views
2

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

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

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

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

回答

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 ]]; 

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

+0

这帮助了我,我只是想补充具有自己内心的看法(消息查看在这种情况下),你可以复制在故事板这种行为连接到所有四个scrollView的两侧,但然后添加一个相等的宽度约束到scrollView。如果scrollView连接到超级视图,则会自动将contentView的宽度设置为超级视图的宽度。还处理定位更新。 – BreadicalMD

2

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

  • 明确设置子视图的宽度增加它的UIScrollView
  • 子类的UIScrollView并重写SETFRAMElayoutSubviews前这样

    @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 
    
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) 
} 
+0

+1,因为这绝对是现在走的路。 2014 => 2017.使用SnapKit或PureLayout,但不要使用原生Autolayout API(除非你有太多时间)。 – florian

相关问题