//
// UIView.h
// UIKit
//
// Copyright (c) 2005-2013, Apple Inc. All rights reserved.
//
#pragma mark UIView 动画曲线
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
UIViewAnimationCurveEaseInOut, // 开始和结尾较慢
UIViewAnimationCurveEaseIn, // 开始较慢
UIViewAnimationCurveEaseOut, // 结尾较慢
UIViewAnimationCurveLinear // 匀速动画
};
#pragma mark UIView 的内容填充方式
typedef NS_ENUM(NSInteger, UIViewContentMode) { //
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is transparent
UIViewContentModeScaleAspectFill, // contents scaled to fill with fixed aspect. some portion of content may be clipped.
UIViewContentModeRedraw, // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter, // contents remain same size. positioned adjusted.
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
};
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { // 转场动画形式
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft, // 从左边翻页
UIViewAnimationTransitionFlipFromRight, // 从右边翻页
UIViewAnimationTransitionCurlUp, // 从上往下翻
UIViewAnimationTransitionCurlDown, // 从下网上翻
};
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) {
UIViewAnimationOptionLayoutSubviews = 1 << 0,
UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animating
UIViewAnimationOptionBeginFromCurrentState = 1 << 2, // start all views from current value, not initial value
UIViewAnimationOptionRepeat = 1 << 3, // repeat animation indefinitely
UIViewAnimationOptionAutoreverse = 1 << 4, // if repeat, run animation back and forth
UIViewAnimationOptionOverrideInheritedDuration = 1 << 5, // ignore nested duration
UIViewAnimationOptionOverrideInheritedCurve = 1 << 6, // ignore nested curve
UIViewAnimationOptionAllowAnimatedContent = 1 << 7, // animate contents (applies to transitions only)
UIViewAnimationOptionShowHideTransitionViews = 1 << 8, // flip to/from hidden state instead of adding/removing
UIViewAnimationOptionOverrideInheritedOptions = 1 << 9, // do not inherit any options or animation type
UIViewAnimationOptionCurveEaseInOut = 0 << 16, // default
UIViewAnimationOptionCurveEaseIn = 1 << 16,
UIViewAnimationOptionCurveEaseOut = 2 << 16,
UIViewAnimationOptionCurveLinear = 3 << 16, // 匀速
UIViewAnimationOptionTransitionNone = 0 << 20, // default
UIViewAnimationOptionTransitionFlipFromLeft = 1 << 20,
UIViewAnimationOptionTransitionFlipFromRight = 2 << 20,
UIViewAnimationOptionTransitionCurlUp = 3 << 20,
UIViewAnimationOptionTransitionCurlDown = 4 << 20,
UIViewAnimationOptionTransitionCrossDissolve = 5 << 20,
UIViewAnimationOptionTransitionFlipFromTop = 6 << 20,
UIViewAnimationOptionTransitionFlipFromBottom = 7 << 20,
} NS_ENUM_AVAILABLE_IOS(4_0);
typedef NS_OPTIONS(NSUInteger, UIViewKeyframeAnimationOptions) {
UIViewKeyframeAnimationOptionLayoutSubviews = UIViewAnimationOptionLayoutSubviews,
UIViewKeyframeAnimationOptionAllowUserInteraction = UIViewAnimationOptionAllowUserInteraction, // turn on user interaction while animating
UIViewKeyframeAnimationOptionBeginFromCurrentState = UIViewAnimationOptionBeginFromCurrentState, // start all views from current value, not initial value
UIViewKeyframeAnimationOptionRepeat = UIViewAnimationOptionRepeat, // repeat animation indefinitely
UIViewKeyframeAnimationOptionAutoreverse = UIViewAnimationOptionAutoreverse, // if repeat, run animation back and forth
UIViewKeyframeAnimationOptionOverrideInheritedDuration = UIViewAnimationOptionOverrideInheritedDuration, // ignore nested duration
UIViewKeyframeAnimationOptionOverrideInheritedOptions = UIViewAnimationOptionOverrideInheritedOptions, // do not inherit any options or animation type
UIViewKeyframeAnimationOptionCalculationModeLinear = 0 << 10, // default
UIViewKeyframeAnimationOptionCalculationModeDiscrete = 1 << 10,
UIViewKeyframeAnimationOptionCalculationModePaced = 2 << 10,
UIViewKeyframeAnimationOptionCalculationModeCubic = 3 << 10,
UIViewKeyframeAnimationOptionCalculationModeCubicPaced = 4 << 10
} NS_ENUM_AVAILABLE_IOS(7_0);
typedef NS_ENUM(NSUInteger, UISystemAnimation) {
UISystemAnimationDelete, // removes the views from the hierarchy when complete
} NS_ENUM_AVAILABLE_IOS(7_0);
typedef NS_ENUM(NSInteger, UIViewTintAdjustmentMode) {
UIViewTintAdjustmentModeAutomatic,
UIViewTintAdjustmentModeNormal,
UIViewTintAdjustmentModeDimmed,
} NS_ENUM_AVAILABLE_IOS(7_0);
@class UIBezierPath, UIEvent, UIWindow, UIViewController, UIColor, UIGestureRecognizer, UIMotionEffect, CALayer;
NS_CLASS_AVAILABLE_IOS(2_0)
@interface UIView : UIResponder {
@package
CALayer *_layer;
id _gestureInfo;
NSMutableArray *_gestureRecognizers;
NSArray *_subviewCache;
float _charge;
NSInteger _tag;
UIViewController *_viewDelegate;
NSString *_backgroundColorSystemColorName;
NSUInteger _countOfMotionEffectsInSubtree;
struct {
unsigned int userInteractionDisabled:1;
unsigned int implementsDrawRect:1;
unsigned int implementsDidScroll:1;
unsigned int implementsMouseTracking:1;
unsigned int hasBackgroundColor:1;
unsigned int isOpaque:1;
unsigned int becomeFirstResponderWhenCapable:1;
unsigned int interceptMouseEvent:1;
unsigned int deallocating:1;
unsigned int debugFlash:1;
unsigned int debugSkippedSetNeedsDisplay:1;
unsigned int debugScheduledDisplayIsRequired:1;
unsigned int isInAWindow:1;
unsigned int isAncestorOfFirstResponder:1;
unsigned int dontAutoresizeSubviews:1;
unsigned int autoresizeMask:6;
unsigned int patternBackground:1;
unsigned int fixedBackgroundPattern:1;
unsigned int dontAnimate:1;
unsigned int superLayerIsView:1;
unsigned int layerKitPatternDrawing:1;
unsigned int multipleTouchEnabled:1;
unsigned int exclusiveTouch:1;
unsigned int hasViewController:1;
unsigned int needsDidAppearOrDisappear:1;
unsigned int gesturesEnabled:1;
unsigned int deliversTouchesForGesturesToSuperview:1;
unsigned int chargeEnabled:1;
unsigned int skipsSubviewEnumeration:1;
unsigned int needsDisplayOnBoundsChange:1;
unsigned int hasTiledLayer:1;
unsigned int hasLargeContent:1;
unsigned int unused:1;
unsigned int traversalMark:1;
unsigned int appearanceIsInvalid:1;
unsigned int monitorsSubtree:1;
unsigned int hostsAutolayoutEngine:1;
unsigned int constraintsAreClean:1;
unsigned int subviewLayoutConstraintsAreClean:1;
unsigned int intrinsicContentSizeConstraintsAreClean:1;
unsigned int potentiallyHasDanglyConstraints:1;
unsigned int doesNotTranslateAutoresizingMaskIntoConstraints:1;
unsigned int autolayoutIsClean:1;
unsigned int subviewsAutolayoutIsClean:1;
unsigned int layoutFlushingDisabled:1;
unsigned int layingOutFromConstraints:1;
unsigned int wantsAutolayout:1;
unsigned int subviewWantsAutolayout:1;
unsigned int isApplyingValuesFromEngine:1;
unsigned int isInAutolayout:1;
unsigned int isUpdatingAutoresizingConstraints:1;
unsigned int isUpdatingConstraints:1;
unsigned int stayHiddenAwaitingReuse:1;
unsigned int stayHiddenAfterReuse:1;
unsigned int skippedLayoutWhileHiddenForReuse:1;
unsigned int hasMaskView:1;
unsigned int hasVisualAltitude:1;
unsigned int hasBackdropMaskViews:1;
unsigned int backdropMaskViewFlags:3;
unsigned int delaysTouchesForSystemGestures:1;
unsigned int subclassShouldDelayTouchForSystemGestures:1;
unsigned int hasMotionEffects:1;
unsigned int backdropOverlayMode:2;
unsigned int tintAdjustmentMode:2;
unsigned int isReferenceView:1;
} _viewFlags;
}
+ (Class)layerClass; //
- (id)initWithFrame:(CGRect)frame; // 初始化frame
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; // 用户交互是否可用,默认是可用(YES)的。
@property(nonatomic) NSInteger tag; // tag 默认是0
@property(nonatomic,readonly,retain) CALayer *layer; // 返回 view 的图层,返回值不能为空,view 是图层的代理。
@end
@interface UIView(UIViewGeometry)
# 是否会显示动画、view 不要使用形状来产生动画,因为可能会不正确显示 view 的实际位置,推荐使用 bounds + center 代替
@property(nonatomic) CGRect frame; // 形状
# 使用 bounds/center 来替代 frame 产生没有什么特性的形变. 如果形状很奇怪,中点可能会产生极小的变化,如果矩形经过旋转变形后没有恢复,使用frame来调整位置会出错,使用center不会出错
@property(nonatomic) CGRect bounds; // 形状 可动画
@property(nonatomic) CGPoint center; // 形状的中心. 可动画
@property(nonatomic) CGAffineTransform transform; // 形变 可动画
@property(nonatomic) CGFloat contentScaleFactor NS_AVAILABLE_IOS(4_0);
@property(nonatomic,getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled; // 多点触控,默认是 NO
# exclusiveTouch的意义在于:如果当前设置了exclusiveTouch的UIView是整个触摸事件的第一响应者,那么到你所有的手指离开屏幕前其他的UIView是无法接受到整个事件周期内所有的触摸事件。
@property(nonatomic,getter=isExclusiveTouch) BOOL exclusiveTouch; // 默认是 NO
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; // 判断点击的点是否在view内部,默认在内部,返回YES
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
# 默认是 YES. 内部子控件会随着 self.bounds 的形状改变而自动调整固定的形状
@property(nonatomic) BOOL autoresizesSubviews;
# 简单的大小改变. 默认是 UIViewAutoresizingNone
@property(nonatomic) UIViewAutoresizing autoresizingMask;
- (CGSize)sizeThatFits:(CGSize)size; // 返回所给尺寸的最佳尺寸(根据内部子控件的尺寸来调整),但是不会改变内部子控件的尺寸
- (void)sizeToFit; // 调用 sizeThatFits 方法,默认带有两个参数,现在的尺寸和要改变的尺寸
@end
@interface UIView(UIViewHierarchy)
@property(nonatomic,readonly) UIView *superview; // 父控件
@property(nonatomic,readonly,copy) NSArray *subviews; // 子控件
@property(nonatomic,readonly) UIWindow *window; // 桌面
- (void)removeFromSuperview; // 从父控件中移除,子控件自己调用
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; // 在某一个索引处插入子控件,可影响可见性
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2; // 改变两个子控件的位置
- (void)addSubview:(UIView *)view; // 增加子控件
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; // 在某一个子控件的下一层插入一个子控件
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview; // 在某一个子控件的上一层插入一个子控件
- (void)bringSubviewToFront:(UIView *)view; // 将一个子控件移到最前面
- (void)sendSubviewToBack:(UIView *)view; // 将一个子控件移到最后面
- (void)didAddSubview:(UIView *)subview; // 增加完子控件以后调用
- (void)willRemoveSubview:(UIView *)subview; // 将要移除子控件时调用
#pragma mark - 给控件选择新的父控件
- (void)willMoveToSuperview:(UIView *)newSuperview; // 将要切换父控件
- (void)didMoveToSuperview; // 已经切换父控件
- (void)willMoveToWindow:(UIWindow *)newWindow; // 控件将要切换窗口
- (void)didMoveToWindow; // 切换完窗口会调用
- (BOOL)isDescendantOfView:(UIView *)view; //
- (UIView *)viewWithTag:(NSInteger)tag; // 通过一个tag来取得内部的控件,也包括自己
- (void)setNeedsLayout;
- (void)layoutIfNeeded;
// 控件frame改变的时候会自动调用这个方法,可以在内部修改子控件的frame
- (void)layoutSubviews;
@end
#pragma mark - 绘图相关
@interface UIView(UIViewRendering)
- (void)drawRect:(CGRect)rect;
- (void)setNeedsDisplay; // 重新绘制,刷帧
- (void)setNeedsDisplayInRect:(CGRect)rect; // rect范围内的局部区域刷新
@property(nonatomic) BOOL clipsToBounds; // 当设置为yes时,超出当前视图的尺寸的内容和子视图不会显示。默认是 NO
@property(nonatomic,copy) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; // 背景色,默认是空(无色)
@property(nonatomic) CGFloat alpha; // 透明度,可动画,默认是1(不透明)
@property(nonatomic,getter=isOpaque) BOOL opaque; // 透明度 YES , 可以优化性能
@property(nonatomic) BOOL clearsContextBeforeDrawing; // 默认 YES.保证在重新绘制的时候,会删除以前绘制的图形 ignored for opaque views. for non-opaque views causes the active CGContext in drawRect: to be pre-filled with transparent pixels
@property(nonatomic,getter=isHidden) BOOL hidden; // 默认是 NO.
@property(nonatomic) UIViewContentMode contentMode; // 内容的填充方式。默认是拉伸填满
@property(nonatomic) CGRect contentStretch NS_DEPRECATED_IOS(3_0,6_0); // 伸缩的区域
@property(nonatomic,retain) UIColor *tintColor NS_AVAILABLE_IOS(7_0);
@property(nonatomic) UIViewTintAdjustmentMode tintAdjustmentMode NS_AVAILABLE_IOS(7_0);
- (void)tintColorDidChange NS_AVAILABLE_IOS(7_0); # 在 tintColor 改变的时候,系统自动调用,在实现中可以对空间进行重新调整
@end
#pragma mark - 动画相关
@interface UIView(UIViewAnimation)
+ (void)beginAnimations:(NSString *)animationID context:(void *)context; // 开始动画
+ (void)commitAnimations; // 提交动画
#pragma - mark 动画代理
+ (void)setAnimationDelegate:(id)delegate; // 设置动画代理
+ (void)setAnimationWillStartSelector:(SEL)selector; // 动画将要开始时执行什么方法,先设置代理
+ (void)setAnimationDidStopSelector:(SEL)selector; // 动画执行完时调用什么方法 ,需要先设置代理
+ (void)setAnimationDuration:(NSTimeInterval)duration; // 动画时间 默认 0.2
+ (void)setAnimationDelay:(NSTimeInterval)delay; // 延迟时间
+ (void)setAnimationStartDate:(NSDate *)startDate; // 什么时间执行动画 默认 now ([NSDate date])
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // 动画效果
+ (void)setAnimationRepeatCount:(float)repeatCount; // 动画重复次数
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO. used if repeat count is non-zero
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO. If YES, the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default).
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // current limitation - only one per begin/commit block
+ (void)setAnimationsEnabled:(BOOL)enabled; // 设置是否能动画,设置后会忽略任何改变
+ (BOOL)areAnimationsEnabled; // view设置后在view的形状改变时,会有一段时间的动画间隔
+ (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation NS_AVAILABLE_IOS(7_0);
@end
#pragma mark - Blocks动画
@interface UIView(UIViewAnimationWithBlocks)
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0); // delay = 0.0, options = 0
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations NS_AVAILABLE_IOS(4_0); // delay = 0.0, options = 0, completion = NULL
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
#pragma - mark 转场动画
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0); // toView added to fromView.superview, fromView removed from its superview
+ (void)performSystemAnimation:(UISystemAnimation)animation onViews:(NSArray *)views options:(UIViewAnimationOptions)options animations:(void (^)(void))parallelAnimations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
@end
@interface UIView (UIViewKeyframeAnimations)
+ (void)animateKeyframesWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
+ (void)addKeyframeWithRelativeStartTime:(double)frameStartTime relativeDuration:(double)frameDuration animations:(void (^)(void))animations NS_AVAILABLE_IOS(7_0); // start time and duration are values between 0.0 and 1.0 specifying time and duration relative to the overall time of the keyframe animation
@end
@interface UIView (UIViewGestureRecognizers)
@property(nonatomic,copy) NSArray *gestureRecognizers NS_AVAILABLE_IOS(3_2);
- (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer NS_AVAILABLE_IOS(3_2);
- (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer NS_AVAILABLE_IOS(3_2);
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer NS_AVAILABLE_IOS(6_0);
@end
@interface UIView (UIViewMotionEffects)
- (void)addMotionEffect:(UIMotionEffect *)effect NS_AVAILABLE_IOS(7_0);
- (void)removeMotionEffect:(UIMotionEffect *)effect NS_AVAILABLE_IOS(7_0);
@property (copy, nonatomic) NSArray *motionEffects NS_AVAILABLE_IOS(7_0);
@end
//
// UIView Constraint-based Layout Support
//
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
UILayoutConstraintAxisHorizontal = 0,
UILayoutConstraintAxisVertical = 1
};
@interface UIView (UIConstraintBasedLayoutInstallingConstraints)
- (NSArray *)constraints NS_AVAILABLE_IOS(6_0);
- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0);
- (void)addConstraints:(NSArray *)constraints NS_AVAILABLE_IOS(6_0);
- (void)removeConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0);
- (void)removeConstraints:(NSArray *)constraints NS_AVAILABLE_IOS(6_0);
@end
@interface UIView (UIConstraintBasedLayoutCoreMethods)
- (void)updateConstraintsIfNeeded NS_AVAILABLE_IOS(6_0); // Updates the constraints from the bottom up for the view hierarchy rooted at the receiver. UIWindow's implementation creates a layout engine if necessary first.
- (void)updateConstraints NS_AVAILABLE_IOS(6_0); // Override this to adjust your special constraints during a constraints update pass
- (BOOL)needsUpdateConstraints NS_AVAILABLE_IOS(6_0);
- (void)setNeedsUpdateConstraints NS_AVAILABLE_IOS(6_0);
@end
// Compatibility and Adoption
@interface UIView (UIConstraintBasedCompatibility)
- (BOOL)translatesAutoresizingMaskIntoConstraints NS_AVAILABLE_IOS(6_0); // Default YES
- (void)setTranslatesAutoresizingMaskIntoConstraints:(BOOL)flag NS_AVAILABLE_IOS(6_0);
+ (BOOL)requiresConstraintBasedLayout NS_AVAILABLE_IOS(6_0);
@end
// Separation of Concerns
@interface UIView (UIConstraintBasedLayoutLayering)
- (CGRect)alignmentRectForFrame:(CGRect)frame NS_AVAILABLE_IOS(6_0);
- (CGRect)frameForAlignmentRect:(CGRect)alignmentRect NS_AVAILABLE_IOS(6_0);
/* override this if the alignment rect is obtained from the frame by insetting each edge by a fixed amount. This is only called by alignmentRectForFrame: and frameForAlignmentRect:.
*/
- (UIEdgeInsets)alignmentRectInsets NS_AVAILABLE_IOS(6_0);
/* When you make a constraint on the NSLayoutAttributeBaseline of a view, the system aligns with the bottom of the view returned from this method. A nil return is interpreted as the receiver, and a non-nil return must be in the receiver's subtree. UIView's implementation returns self.
*/
- (UIView *)viewForBaselineLayout NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN const CGFloat UIViewNoIntrinsicMetric NS_AVAILABLE_IOS(6_0); // -1
- (CGSize)intrinsicContentSize NS_AVAILABLE_IOS(6_0);
- (void)invalidateIntrinsicContentSize NS_AVAILABLE_IOS(6_0); // call this when something changes that affects the intrinsicContentSize. Otherwise UIKit won't notice that it changed.
- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
@end
// Size To Fit
UIKIT_EXTERN const CGSize UILayoutFittingCompressedSize NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN const CGSize UILayoutFittingExpandedSize NS_AVAILABLE_IOS(6_0);
@interface UIView (UIConstraintBasedLayoutFittingSize)
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize NS_AVAILABLE_IOS(6_0);
@end
// Debugging
/* Everything in this section should be used in debugging only, never in shipping code. These methods may not exist in the future - no promises.
*/
@interface UIView (UIConstraintBasedLayoutDebugging)
/* This returns a list of all the constraints that are affecting the current location of the receiver. The constraints do not necessarily involve the receiver, they may affect the frame indirectly.
Pass UILayoutConstraintAxisHorizontal for the constraints affecting [self center].x and CGRectGetWidth([self bounds]), and UILayoutConstraintAxisVertical for the constraints affecting[self center].y and CGRectGetHeight([self bounds]).
*/
- (NSArray *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
/* If there aren't enough constraints in the system to uniquely determine layout, we say the layout is ambiguous. For example, if the only constraint in the system was x = y + 100, then there are lots of different possible values for x and y. This situation is not automatically detected by UIKit, due to performance considerations and details of the algorithm used for layout.
The symptom of ambiguity is that views sometimes jump from place to place, or possibly are just in the wrong place.
-hasAmbiguousLayout runs a check for whether there is another center and bounds the receiver could have that could also satisfy the constraints.
-exerciseAmbiguousLayout does more. It randomly changes the view layout to a different valid layout. Making the UI jump back and forth can be helpful for figuring out where you're missing a constraint.
*/
- (BOOL)hasAmbiguousLayout NS_AVAILABLE_IOS(6_0);
- (void)exerciseAmbiguityInLayout NS_AVAILABLE_IOS(6_0);
@end
@interface UIView (UIStateRestoration)
@property (nonatomic, copy) NSString *restorationIdentifier NS_AVAILABLE_IOS(6_0);
- (void) encodeRestorableStateWithCoder:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);
- (void) decodeRestorableStateWithCoder:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);
@end
#pragma mark - 截图相关
@interface UIView (UISnapshotting)
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
- (UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(7_0); // Resizable snapshots will default to stretching the center
// Use this method to render a snapshot of the view hierarchy into the current context. Returns NO if the snapshot is missing image data, YES if the snapshot is complete. Calling this method from layoutSubviews while the current transaction is committing will capture what is currently displayed regardless if afterUpdates is YES.
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
@end