UILayoutGuide是一个iOS 9后推出的一个虚拟
View
.我们可以理解为一个hidden的View(其实没有这个View.因为UILayoutGuide继承与NSObject)
@interface UILayoutGuide : NSObject <NSCoding>
/// 在`owningView`坐标系内的frame(可以直接理解为虚拟View的frame)
@property(nonatomic,readonly) CGRect layoutFrame;
/* 因为添加`UILayoutGuide`是通过UIView的`addLayoutGuide:`方法添加的.
所以这个owningView就是调用`addLayoutGuide:`的`view`.
*/
@property(nonatomic,weak,nullable) UIView *owningView;
/// 和NSConstraints的`identifier`也是一个道理,用来调试用的.
@property(nonatomic,copy) NSString *identifier;
// MARK: 下面的属性可以在`NSLayoutAnchor.h`中看
/// 前沿锚
@property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *leadingAnchor;
/// 后沿锚
@property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *trailingAnchor;
/// 左边锚
@property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *leftAnchor;
/// 右边锚
@property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *rightAnchor;
/// 上边锚
@property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *topAnchor;
/// 底边锚
@property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *bottomAnchor;
/// 宽度锚
@property(nonatomic,readonly,strong) NSLayoutDimension *widthAnchor;
/// 高度锚
@property(nonatomic,readonly,strong) NSLayoutDimension *heightAnchor;
/// centerX锚
@property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *centerXAnchor;
/// centerY锚
@property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *centerYAnchor;
除了上面的这些还有UIView.h
文件中定义的UILayoutGuide
的分类
@interface UILayoutGuide (UIConstraintBasedLayoutDebugging)
/// 获取axis方向的有关的约束.
- (NSArray<__kindof NSLayoutConstraint *> *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis API_AVAILABLE(ios(10.0));
/// 是否有约束冲突
@property(nonatomic, readonly) BOOL hasAmbiguousLayout API_AVAILABLE(ios(10.0));
@end
UILayoutGuide使用用例
self.viewTest = [UIView new];
self.viewTest.backgroundColor = [UIColor greenColor];
[self.view addSubview:self.viewTest];
self.viewTest.translatesAutoresizingMaskIntoConstraints = NO;
UILayoutGuide *layoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:layoutGuide];
[layoutGuide.leftAnchor constraintEqualToAnchor:self.view.leftAnchor].active = YES;
[layoutGuide.topAnchor constraintEqualToAnchor:self.view.topAnchor].active = YES;
[layoutGuide.rightAnchor constraintEqualToAnchor:self.view.rightAnchor].active = YES;
[layoutGuide.heightAnchor constraintEqualToAnchor:self.view.heightAnchor multiplier:.5].active = YES;
NSLayoutDimension
这个就是一个工厂类.可以方便的添加与锚点有关的约束.
// This layout anchor subclass is used for sizes (width & height).
NSLAYOUTANCHOR_EXTERN API_AVAILABLE(macos(10.11), ios(9.0))
@interface NSLayoutDimension : NSLayoutAnchor<NSLayoutDimension *>
// These methods return an inactive constraint of the form thisVariable = constant.
- (NSLayoutConstraint *)constraintEqualToConstant:(CGFloat)c __attribute__((warn_unused_result));
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToConstant:(CGFloat)c __attribute__((warn_unused_result));
- (NSLayoutConstraint *)constraintLessThanOrEqualToConstant:(CGFloat)c __attribute__((warn_unused_result));
// These methods return an inactive constraint of the form thisAnchor = otherAnchor * multiplier.
- (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m __attribute__((warn_unused_result));
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m __attribute__((warn_unused_result));
- (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m __attribute__((warn_unused_result));
// These methods return an inactive constraint of the form thisAnchor = otherAnchor * multiplier + constant.
- (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m constant:(CGFloat)c __attribute__((warn_unused_result));
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m constant:(CGFloat)c __attribute__((warn_unused_result));
- (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m constant:(CGFloat)c __attribute__((warn_unused_result));
@end
这些创建都比较方便.创建完毕之后都会被转化成约束.具体参数其实可以看上面
UILayoutGuide
的使用用例.具体参数可以参考UILayoutConstraint.配合UILayoutGuide
食用更佳.