【TIP】scrollview中的autolayout小技巧

还是先来看个需求:


【TIP】scrollview中的autolayout小技巧_第1张图片
03教师风采.png

由图可知,这个界面由两个label和一个imageview组成,imageview是大图需要按比例显示,底下的介绍文字可能会很多所以高度也是动态的,这种组合情况比较简单所以就不用tableview或者webview之类的视图控件了,直接用scrollview即可。

下面简单的铺设下这个页面:

@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 = @"教师风采";
    [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里,双击下图这个地方,


【TIP】scrollview中的autolayout小技巧_第2张图片
QQ20141213-1.png

可以进入constrait的详情,然后可以将这条constraint IBOutlet出来,在controller里就可以根据图片的尺寸动态修改这个constrait的constant来改变布局了。

【TIP】scrollview中的autolayout小技巧_第3张图片
QQ20141213-2.png

至于contentLabel的按文字内容自动改变高度,只需简单的几个步骤:
1、设置好leading,trailing,width,height的约束
2、设置lineNumber和lineBreakModel


【TIP】scrollview中的autolayout小技巧_第4张图片
QQ20141213-4.png

3、设置height的priory


【TIP】scrollview中的autolayout小技巧_第5张图片
QQ20141213-5.png

小技巧介绍完毕,来看下sb里的约束情况:


【TIP】scrollview中的autolayout小技巧_第6张图片
QQ20141213-3.png

都是简单的固定高度,和根据parentView约束宽度。

那么先来看看效果吧:


【TIP】scrollview中的autolayout小技巧_第7张图片
Screen Shot 2014-12-13 at 11.15.48.png

纳尼?imageview的宽度明明是根据scrollview的宽度来约束的,为何scrollview的contentsize还是跟sb里预设的一样?

为了找出原因,我们使用sizeClass查看一下窄屏时候的情况。


【TIP】scrollview中的autolayout小技巧_第8张图片
QQ20141213-6.png

what a fuck!这玩意压根没有变嘛!有人可能会说你不是固定了imageview的宽度吗?是的,但是一般情况下,宽度的约束优先级是小于leading和trailing的约束的,即只要父view的宽度一定,子view的leading和trailing设置了约束,无论你width是多少,子view的宽度都已经确定了。(这是我个人的理解,说的不对的地方请大神指导)同时可以看看我并没有设置宽度的label。

【TIP】scrollview中的autolayout小技巧_第9张图片
QQ20141213-7.png

还是跟原来一样对不对。后来我查阅资料得知,scrollview里的子view,上下左右的约束对应的并不是scrollview的边,而是scrollview的contentSize的边。那么如何指定contentSize的宽度,让它只能上下滚动呢?

脑洞开一下。contentSize的宽度取决于子view的宽度,子view的宽度同时又跟scrollview的宽度有关,那么我再用一个contentView将所有子view都包裹起来,同时设置上下左右到scrollview的距离都为0,并且设置contentView和scrollview的宽度相等,如下图所示。

【TIP】scrollview中的autolayout小技巧_第10张图片
QQ20141213-8.png

还有其他步骤吗?没有了,是不是很简单?sb改动了这么多而代码却一句都没有改,这就是autolayout的魅力。

最后让我们来看下效果:

【TIP】scrollview中的autolayout小技巧_第11张图片
Screen Shot 2014-12-13 at 10.57.52.png

搞定收工!scrollview的autolayout这个坑我已经爬了半年了,没有办法的时候一直使用tableview的hearderview来代替,直到@叶孤城__大神教会了我@property (nonatomic , weak) IBOutlet NSLayoutConstraint *imageHeight;这一招。
希望这篇文章对还在爬坑的小伙伴有所帮助,弯路虽然能够帮助我们增长经验和见识,但是青春毕竟是不等人的。

你可能感兴趣的:(【TIP】scrollview中的autolayout小技巧)