Anchor(视图锚点)

it2022-05-09  36

NSLayoutAnchor 布局锚点

@interface NSLayoutAnchor<AnchorType> : NSObject // NSLayoutAnchor在macOS 10.12和iOS 10和tvOS 10以及以上的版本上遵循<NSCopying>、<NSCoding> /// 锚点A ==/>=/<= 锚点B - (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor __attribute__((warn_unused_result)); - (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor __attribute__((warn_unused_result)); - (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor __attribute__((warn_unused_result)); // MARK: 锚点A ==/>=/<= 锚点B + 常数. - (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor constant:(CGFloat)c __attribute__((warn_unused_result)); - (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor constant:(CGFloat)c __attribute__((warn_unused_result)); - (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor constant:(CGFloat)c __attribute__((warn_unused_result)); // MARK: 这些用来调试 @property (readonly, copy) NSString *name API_AVAILABLE(macos(10.12)) API_UNAVAILABLE(ios, watchos, tvos); @property (readonly, nullable, weak) id item API_AVAILABLE(macos(10.12)) API_UNAVAILABLE(ios, watchos, tvos); @property (readonly) BOOL hasAmbiguousLayout API_AVAILABLE(macos(10.12)) API_UNAVAILABLE(ios, watchos, tvos); @property (readonly) NSArray<NSLayoutConstraint *> *constraintsAffectingLayout API_AVAILABLE(macos(10.12)) API_UNAVAILABLE(ios, watchos, tvos); @end --- @class NSLayoutXAxisAnchor, NSLayoutYAxisAnchor, NSLayoutDimension; NSLAYOUTANCHOR_EXTERN API_AVAILABLE(macos(10.11), ios(9.0)) /// NSLayoutAnchor的子类.描述特殊轴的锚点.顶部、底部.前、后.基线等. @interface NSLayoutXAxisAnchor : NSLayoutAnchor<NSLayoutXAxisAnchor *> // 创建水平方向锚点相关的布局锚点 - (NSLayoutDimension *)anchorWithOffsetToAnchor:(NSLayoutXAxisAnchor *)otherAnchor API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0)); @end --- NSLAYOUTANCHOR_EXTERN API_AVAILABLE(macos(10.11), ios(9.0)) @interface NSLayoutYAxisAnchor : NSLayoutAnchor<NSLayoutYAxisAnchor *> // 创建垂直方向锚点相关的布局锚点 - (NSLayoutDimension *)anchorWithOffsetToAnchor:(NSLayoutYAxisAnchor *)otherAnchor API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0)); @end --- // 这个布局锚点用于宽、高 NSLAYOUTANCHOR_EXTERN API_AVAILABLE(macos(10.11), ios(9.0)) @interface NSLayoutDimension : NSLayoutAnchor<NSLayoutDimension *> /// 当前变量 = 常数 - (NSLayoutConstraint *)constraintEqualToConstant:(CGFloat)c __attribute__((warn_unused_result)); - (NSLayoutConstraint *)constraintGreaterThanOrEqualToConstant:(CGFloat)c __attribute__((warn_unused_result)); - (NSLayoutConstraint *)constraintLessThanOrEqualToConstant:(CGFloat)c __attribute__((warn_unused_result)); /// 此方法返回inactive的`当前Anchor = anchor * 比例` - (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)); 此方法返回inactive的`当前Anchor = anchor * 比例 + 常数` - (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 #endif // NSLAYOUTANCHOR_H --- @interface NSLayoutXAxisAnchor (UIViewDynamicSystemSpacingSupport) /// 接收器 [= | ≥ | ≤] '锚点' + '比例' * 系统常量(注意,这里*的是系统常量) - (NSLayoutConstraint *)constraintEqualToSystemSpacingAfterAnchor:(NSLayoutXAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(ios(11.0),tvos(11.0)); - (NSLayoutConstraint *)constraintGreaterThanOrEqualToSystemSpacingAfterAnchor:(NSLayoutXAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(ios(11.0),tvos(11.0)); - (NSLayoutConstraint *)constraintLessThanOrEqualToSystemSpacingAfterAnchor:(NSLayoutXAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(ios(11.0),tvos(11.0)); @end --- @interface NSLayoutYAxisAnchor (UIViewDynamicSystemSpacingSupport) /// 接收器 [= | ≥ | ≤] '锚点' + '比例' * 系统常量(注意,这里*的是系统常量) - (NSLayoutConstraint *)constraintEqualToSystemSpacingBelowAnchor:(NSLayoutYAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(ios(11.0),tvos(11.0)); - (NSLayoutConstraint *)constraintGreaterThanOrEqualToSystemSpacingBelowAnchor:(NSLayoutYAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(ios(11.0),tvos(11.0)); - (NSLayoutConstraint *)constraintLessThanOrEqualToSystemSpacingBelowAnchor:(NSLayoutYAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(ios(11.0),tvos(11.0)); @end

代码用例

self.viewTest = [UIView new]; self.viewTest.backgroundColor = [UIColor greenColor]; [self.view addSubview:self.viewTest]; self.viewTest.translatesAutoresizingMaskIntoConstraints = NO; [self.viewTest.leadingAnchor constraintEqualToSystemSpacingAfterAnchor:self.view.leadingAnchor multiplier:0].active = YES; [self.viewTest.trailingAnchor constraintEqualToSystemSpacingAfterAnchor:self.view.trailingAnchor multiplier:0].active = YES; [self.viewTest.topAnchor constraintEqualToSystemSpacingBelowAnchor:self.view.topAnchor multiplier:0].active = YES; [self.viewTest.bottomAnchor constraintEqualToSystemSpacingBelowAnchor:self.view.bottomAnchor multiplier:0].active = YES;

注意代码用例中的multiplier.在这种情况下得传入0.之所以有三个equalTo方法而单单拿这个equalTo方法举例就是因为这个multiplier的特殊性.他是一个系统默认的常数的倍数(8P上测出来的是8PT.其他机型没试)

上面的NSLayoutDimension(宽、高)、NSLayoutXAxisAnchor(水平方向有关)、NSLayoutYAxisAnchor(垂直方向有关).具体可以看下面举的UIView的属性例子

UIView的Anchor例子

@property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *leadingAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *trailingAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *leftAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *rightAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *topAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *bottomAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutDimension *widthAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutDimension *heightAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutXAxisAnchor *centerXAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *centerYAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *firstBaselineAnchor API_AVAILABLE(ios(9.0)); @property(nonatomic,readonly,strong) NSLayoutYAxisAnchor *lastBaselineAnchor API_AVAILABLE(ios(9.0));

最新回复(0)