Masonry 約束Scrollview問題

##問題描述  開發中遇到了關於Masonry對於Scrollview的contentSize的設置問題。經過閱讀Masonry的源碼,我最終找到了我想要的方法。框架

 其實問題很簡單,也由於我我的對於Masonry使用還不夠熟練(平時用stb挺多。。)。佈局

 實際狀況是這樣的,我要在一個簡單的視圖中顯示一個標題,一個時間,還有一個文字內容,文字內容不定,可能會不少,多到超出這個屏幕,因爲是很固定的屏幕布局,我採用的方式是,ScrollView加上一個容器View(contentView), 還有三個label便可,三個label加到contentView上,使用Masonry進行佈局。測試

 這裏涉及到contentSize的地方就是其中一個label是放置內容的咱們叫作contentLabel,這個是多行顯示,高度不定,因爲這個視圖是加到了contentView上,contentView的高度決定了ScrollView的contentSize,因而要作的就是保證contentLabel的高度動態變化的同時contentView的高度也要動態變化,纔可以保證超出屏幕以後,能夠滑動查看超出的內容文字。多餘的不說了,看代碼吧。可能代碼寫的很差,但願你們能夠指正:flushed:動畫

##代碼code

@interface DemoVC ()
{
    UIScrollView * _scrollView;
    UIView * _contentView;
    UILabel * _titleLabel;
    UILabel * _timeLabel;
    UILabel * _contentLabel;
}
@end

@implementation DemoVC

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createView];
    [self __layoutSubViews];
}

- (void)createView {
    
    UIScrollView * scrollView = [[UIScrollView alloc] init];
    scrollView.backgroundColor = [UIColor groupTableViewBackgroundColor];
    [self.view addSubview:scrollView];
    _scrollView = scrollView;
    
    UIView * contentView = [[UIView alloc] init];
    contentView.backgroundColor = [UIColor groupTableViewBackgroundColor];
    [scrollView addSubview:contentView];
    _contentView = contentView;
    
    UILabel * titleLabel = [[UILabel alloc] init];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    titleLabel.font = [UIFont systemFontOfSize:16.f];
    titleLabel.textColor = CustomBlackColor;
    [contentView addSubview:titleLabel];
    _titleLabel = titleLabel;
    
    UILabel * timeLabel = [[UILabel alloc] init];
    timeLabel.textAlignment = NSTextAlignmentCenter;
    timeLabel.font = [UIFont systemFontOfSize:11.f];
    timeLabel.textColor = [UIColor lightGrayColor];
    [contentView addSubview:timeLabel];
    _timeLabel = timeLabel;
    
    UILabel * contentLabel = [[UILabel alloc] init];
    contentLabel.numberOfLines = 0;
    contentLabel.font = [UIFont systemFontOfSize:14.f];
    contentLabel.textColor = [UIColor darkGrayColor];
    contentLabel.backgroundColor = [UIColor clearColor];
    [contentView addSubview:contentLabel];
    _contentLabel = contentLabel;
    
}

- (void)__layoutSubViews {
    
    [_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];

    [_contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(_scrollView);
        make.width.equalTo(_scrollView);
        make.height.greaterThanOrEqualTo(@0.f);//此處保證容器View高度的動態變化 大於等於0.f的高度
    }];
    
    [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(_contentView).offset(20.f);
        make.left.equalTo(_contentView).offset(10);
        make.right.equalTo(_contentView).offset(-10);
        make.height.equalTo(@16.f);
    }];
    
    [_timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(_titleLabel.mas_bottom).offset(5.f);
        make.left.equalTo(_contentView).offset(10);
        make.right.equalTo(_contentView).offset(-10);
        make.height.equalTo(@16.f);
    }];
    
    [_contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(_timeLabel.mas_bottom).offset(20.f);
        make.left.equalTo(_contentView).offset(10);
        make.right.equalTo(_contentView).offset(-10);
        make.bottom.equalTo(_contentView).offset(-10);// 設置與容器View底部高度固定,contentLabel高度變化的時候,因爲設置了容器View的高度動態變化,底部距離固定。 此時contentView的高度變化以後,ScrollView的contentSize就發生了變化,適配文字內容,滑動查看超出屏幕文字。
//        make.height.greaterThanOrEqualTo(@16.f);//高度動態變化 大於等於16  
    }];
    
    _titleLabel.text = @"測試效果";
    _timeLabel.text = @"2015.09.09";
    _contentLabel.text = @"爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)爲何要默認向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(能夠認爲是爲iOS建立的私有動畫框架),可是呢,它倒是在Mac OS上面世的,前面有提到,兩者的Y軸是顛倒的。這就致使了默認的3個點位移的陰影是向上的。在Mac上,shadowOffset的默認值是陰影向下的,這樣你就能理解爲何iOS上的陰影方向是向上的了(如圖4.5)";
    

}
相關文章
相關標籤/搜索