stackview

UIStackView的使用

2018-10-14  本文已影响0人  ldhonline
image.png

一、了解 instric content size

instric content size 表示一个 view 的固有的大小,对于 UILabel, UIImageView, UIButton 这些元素来说,在没有显式设置大小的时候,它总是有一个内容撑开的大小
它们是通过方法 -(CGSize)instricContentSize 来返回的, UIView 返回的是一个 zeroSize, 也是大小为0x0, 不可见。

我们可以继承UIView, 添加一个可以设置的固有大小值,来帮助我们更好的完成布局。

#import "ESView.h"

@implementation ESView

-(CGSize)intrinsicContentSize{
    CGSize size = [super intrinsicContentSize];
    if(self.es_intrinsicWidth && self.es_intrinsicHeight){
        return CGSizeMake(self.es_intrinsicWidth, self.es_intrinsicHeight);
    }
    return size;
}

@end

二、UIStackView 的特性

UIStackView 是一个容器决定内容排版的布局模式,容器大小的变化,会影响子项的排版。
类似前端体系中的 flexbox 的简化版。

三、基本用法

1、创建一个 UIStackView

    CGSize size = self.view.bounds.size;
    
    UIStackView *sView = [[UIStackView alloc] initWithFrame:CGRectMake(0, 64, size.width, size.height*0.5)];
    [self.view addSubview:sView];

可以为它指定固定的 frame, 也可以添加约束。

2、设置轴向。

sView.axis = UILayoutConstraintAxisVertical;
//sView.axis = UILayoutConstraintAxisHorizontal;

轴向决定了子项的排列方向,分为水平与垂直两种。

3、设置最小间距。

 sView.spacing = 2;

默认间距是0, 最小间距的意思就是在子项大小超过容器时,也必须保持的间距,真实间距有可能比它大。

4、设置副轴上子项的对齐方式。

sView.alignment = UIStackViewAlignmentTop;

副轴指的是当前axis的正交轴,对齐方式有上、中、下、两端4类。

5、设置内容轴向的宽度或者高度模式。

 sView.distribution = UIStackViewDistributionEqualCentering;

它有5种模式:

[view setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];

拉伸是无限的,所以一般来说,只会拉伸一个子元素,而压缩是有限的,第一个压缩完了不够,就会压缩第二个。

所有模式都是让子项均匀排版,对于空间剩余的情况下,分配策略不同。
注意它们轴向两端都是贴边的, 也就是说,它的轴向对齐方式就是两端对齐 just
可以设置margin来添加外边距

    sView.layoutMarginsRelativeArrangement = YES;
    sView.layoutMargins = UIEdgeInsetsMake(10, 10, 10, 10);

如果只有一个子项的时候,总是被拉伸了。

适应场景

适用于单行或者单列,已知容器大小的前提下排版, 没有flexbox那样可以自动换行。
至少要保证轴向大小是可知的,副轴方向可以取决于内容大小。

上一篇下一篇

猜你喜欢

热点阅读