串哥的Autolayout笔记+Masonry
Masonry
AutoLayout相当于一个公式
view1.attr1 = view2.attr2 * mul + constant
这里就有7个变量.进行控制这个公式.
Masonry的代码样式,是建造者模式.
- Attribute
- (MASConstraint *) left;
- (MASConstraint *) top;
- (MASConstraint *) right;
.....
- (MASConstraint *) baseline;// 字体的基线
// 此下三个值就是上面基础值的组合.
- (MASConstraint *) edges;
- (MASConstraint *) size;
- (MASConstraint *) center;
// iOS8以后出现的, view四周有个margin宽,类似于护城河.
- (MASConstraint *) leftMargin;
-
// 在iOS7中加入了
// 这几个layout值是控制器的值. 而不是控制器中View的值.
mas_topLayoutGuide;
mas_bottomLayoutGUide;
mas_topLayoutGuideTop;
mas_topLayoutGuideBottom;
mas_bottomLayoutGuideTop;
mas_bottomLayoutGuideBottom;
但是控制器有了上面一个guide属性后,会对起中view会产生一些layout影响
// 关闭控制器中,关于控制的延伸layout.
self.edgesForExtendedLayout = UIRectEdgeNone;
// 这个是为Scroll设置一个Inset值.
self.automaticallyAdjustsScrollViewInsets = NO;
Masrony的一些使用
UIView *v1 = ({
UIView *view = [UIView new];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(50, 59));
make.center.equalTo(self.view);
}];
view;
});
UIView * v2 = ({
UIView *view = [UIView new];
view.backgroundColor = [UIColor blueColor];
[self.view addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(50, 59));
make.left.and.top.equalTo(v1);
}];
view;
});
Masrony中相等关系的选择
- greaterThanOrEqualTo >=
- lessThanOrEqualTo <=
- equalTo ==
Constant 偏移量
- offset
- insets
- sizeOffset
- centerOffset
- valueOffset // 上面几种的封装
Multiplier 倍数
- (MASConstraint * (^)(CGFloat multiplier))multipliedBy
- (MASConstraint * (^)(CGFloat divider))dividedBy
Priority 约束优先级
- (MASConstraint * (^)(MASLayoutPriority priority))priority;
- (MASConstraint * (^)())priorityLow;
- (MASConstraint * (^)())priorityMedium;
- (MASConstraint * (^)())priorityHigh;
intrinsicContentSize
!重要概念
一个控件的缺省大小或是默认大小.
这个控制就是UILabel的高度
// UIView的方法
- (void)intrinsicContentSize;
- (void)invalidateIntrinsicContentSize NS_AVAILABLE_IOS(6_0); // call this when something changes that affects the intrinsicContentSize. Otherwise UIKit won't notice that it changed.
如果没有设置一个View的Width或者Height,那么AutoLayout就会用intrinsicContentSize来作为参考.
Content Priority
!重要概念
就是在你被拉伸的时候,查看这个优先级,那么就会决定哪个View会被拉伸或者压缩
ContentComPressIonResistance
contentHuggingPriority
[view setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
设置这个方法,可以让这个view再有被拉伸情况的时候,保持高的优先级不被拉伸.
[view setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
设置这个方法,可以让这个view再有被压缩情况的时候,保持高的优先级不被压缩.
Animation
- Core Animation 改变View或layer的各种属性值.
- POP FaceBook的一个动画库
UIScrollView
需要确认两点
1,窗口大小: bounds
2,内容大小: contentSize
scrollView和其子控件的约束决定了-> ContentSize
scrollView和其父控件的约束决定了-> Frame
这里有一个技巧:
可在scroll中添加一个view层,用其他的控件与这个view进行控件尺寸的约束,然后用这个view与scrollView的edge进行约束,如此做后在迁移复用时,就可以隔离ScrollView,利用View进行便利的迁移.
UIStackView
-
iOS9+
-
FDStackView iOS6+ 可以看下"sunny怎么了"博客. 实现原理
-
作用: 将一组view按照一定的规则再一个方向上堆叠起来
-
本质: 自动生成一组符合规则的约束
axis 方向分: 水平和垂直
alignment 对其方式: 居中对其,顶部对齐.....
distribution 等宽,等高
spacing 控件间的间距
用好UIStackView的诀窍
1,处理好优先级 ->那个需要压缩哪个不需要.
2,善用Spacer
Tips
FDFullscreenPopGesture
看看串哥写的POP的分类.
最后附上串哥的博客地址->>here.