【TIP】scrollview中的autolayout小技巧

還是先來看個需求:


03教師風(fēng)采.png

由圖可知,這個界面由兩個label和一個imageview組成,imageview是大圖需要按比例顯示,底下的介紹文字可能會很多所以高度也是動態(tài)的,這種組合情況比較簡單所以就不用tableview或者webview之類的視圖控件了,直接用scrollview即可。

下面簡單的鋪設(shè)下這個頁面:

@interface ViewController : UIViewController

@property (nonatomic , weak) IBOutlet UILabel *nameLabel;
@property (nonatomic , weak) IBOutlet UIImageView *photoImageView;
@property (nonatomic , weak) IBOutlet UILabel *contentLabel;
@property (nonatomic , weak) IBOutlet NSLayoutConstraint *imageHeight;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.title = @"教師風(fēng)采";
    [self configureUI];
    
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"編輯" style:UIBarButtonItemStylePlain target:self action:@selector(editTeacher)];
    self.navigationItem.rightBarButtonItem = item;
}

- (void)editTeacher
{
}

- (void)configureUI
{
    [_nameLabel setText:@"托雷斯"];
    [_contentLabel setText:@"有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,有錢任性,"];
    [_photoImageView sd_setImageWithURL:[NSURL URLWithString:@"http://timg.aier360.com/headimg/big/7976f8e79bwfklbtpv.jpg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        CGFloat height = 0;
        if (image) {
            height = ([UIScreen mainScreen].bounds.size.width - 16) * image.size.height / image.size.width;
        }
        [UIView animateWithDuration:0.25 animations:^{
            _imageHeight.constant = height;
            [self updateViewConstraints];
        }];
    }];
}
@end

這里有個小技巧,在storyboard里,雙擊下圖這個地方,


QQ20141213-1.png

可以進(jìn)入constrait的詳情,然后可以將這條constraint IBOutlet出來,在controller里就可以根據(jù)圖片的尺寸動態(tài)修改這個constrait的constant來改變布局了。

QQ20141213-2.png

至于contentLabel的按文字內(nèi)容自動改變高度,只需簡單的幾個步驟:
1、設(shè)置好leading,trailing,width,height的約束
2、設(shè)置lineNumber和lineBreakModel


QQ20141213-4.png

3、設(shè)置height的priory


QQ20141213-5.png

小技巧介紹完畢,來看下sb里的約束情況:


QQ20141213-3.png

都是簡單的固定高度,和根據(jù)parentView約束寬度。

那么先來看看效果吧:


Screen Shot 2014-12-13 at 11.15.48.png

納尼?imageview的寬度明明是根據(jù)scrollview的寬度來約束的,為何scrollview的contentsize還是跟sb里預(yù)設(shè)的一樣?

為了找出原因,我們使用sizeClass查看一下窄屏?xí)r候的情況。


QQ20141213-6.png

what a fuck!這玩意壓根沒有變嘛!有人可能會說你不是固定了imageview的寬度嗎?是的,但是一般情況下,寬度的約束優(yōu)先級是小于leading和trailing的約束的,即只要父view的寬度一定,子view的leading和trailing設(shè)置了約束,無論你width是多少,子view的寬度都已經(jīng)確定了。(這是我個人的理解,說的不對的地方請大神指導(dǎo))同時可以看看我并沒有設(shè)置寬度的label。

QQ20141213-7.png

還是跟原來一樣對不對。后來我查閱資料得知,scrollview里的子view,上下左右的約束對應(yīng)的并不是scrollview的邊,而是scrollview的contentSize的邊。那么如何指定contentSize的寬度,讓它只能上下滾動呢?

腦洞開一下。contentSize的寬度取決于子view的寬度,子view的寬度同時又跟scrollview的寬度有關(guān),那么我再用一個contentView將所有子view都包裹起來,同時設(shè)置上下左右到scrollview的距離都為0,并且設(shè)置contentView和scrollview的寬度相等,如下圖所示。

QQ20141213-8.png

還有其他步驟嗎?沒有了,是不是很簡單?sb改動了這么多而代碼卻一句都沒有改,這就是autolayout的魅力。

最后讓我們來看下效果:

Screen Shot 2014-12-13 at 10.57.52.png

搞定收工!scrollview的autolayout這個坑我已經(jīng)爬了半年了,沒有辦法的時候一直使用tableview的hearderview來代替,直到@葉孤城__大神教會了我@property (nonatomic , weak) IBOutlet NSLayoutConstraint *imageHeight;這一招。
希望這篇文章對還在爬坑的小伙伴有所幫助,彎路雖然能夠幫助我們增長經(jīng)驗(yàn)和見識,但是青春畢竟是不等人的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ScrollView 是 UIKit 中很重要的一個組件,TableView 和 UIWebView 等很多涉及到...
    WellCheng閱讀 6,458評論 5 25
  • 項(xiàng)目里的布局一直都是純代碼流,順帶著Autolayout也一直沒有使用,直到遇到了masonry,讓我看到了希望,...
    小笨狼閱讀 9,442評論 25 128
  • 在iOS開發(fā)中,使用可視化編程能夠簡單快速的拖拽出令人滿意的UI。但是,除了簡單的拖拽之外,還有一項(xiàng)工作對于可視化...
    VCC閱讀 4,390評論 7 53
  • 在iOS開發(fā)中,使用可視化編程能夠簡單快速的拖拽出令人滿意的UI。但是,除了簡單的拖拽之外,還有一項(xiàng)工作對于可視化...
    小樣別嘚瑟閱讀 473評論 0 0
  • 年少讀書聞名勝,寒之失年方步此。蒼穹落沉歲月短,再略芳華是何年。
    蘇之閱讀 199評論 0 0

友情鏈接更多精彩內(nèi)容