iOS UIKit框架学习—UIView

UIView类定义了屏幕上一个矩形区域,在iOS中几乎所有的可视化控件都是UIView的子类,它还负责视图的内容管理、子视图管理、事件处理、动画实现等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
@protocol UICoordinateSpace <NSObject>
// 将当前的坐标空间点转换到指定的坐标空间
- (CGPoint)convertPoint:(CGPoint)point toCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
// 将指定的坐标空间点转换到当前的坐标空间
- (CGPoint)convertPoint:(CGPoint)point fromCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
// 将当前的矩形坐标空间转换到指定的矩形坐标空间
- (CGRect)convertRect:(CGRect)rect toCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
// 将指定的矩形坐标空间转换到当前的矩形坐标空间
- (CGRect)convertRect:(CGRect)rect fromCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
// 该view在本地坐标系统中的位置和大小(参照点是,本地坐标系统)
@property (readonly, nonatomic) CGRect bounds NS_AVAILABLE_IOS(8_0);
@end
// 视图的基础图层
#if UIKIT_DEFINE_AS_PROPERTIES
@property(class, nonatomic, readonly) Class layerClass;
#else
+ (Class)layerClass;
#endif
// 初始化视图并设置位置和大小
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
// 用于xib初始化
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
// 是否可以交互
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; // default is YES.
// 当前视图标签
@property(nonatomic) NSInteger tag; // default is 0
// 用于视图渲染的核心动画层
@property(nonatomic,readonly,strong) CALayer *layer;
#if UIKIT_DEFINE_AS_PROPERTIES
// 视图是否可以被聚集(返回YES可能是:视图被隐藏、透明度为0,userInteractionEnabled设置为NO等)
@property(nonatomic,readonly) BOOL canBecomeFocused NS_AVAILABLE_IOS(9_0); // NO by default
#else
- (BOOL)canBecomeFocused NS_AVAILABLE_IOS(9_0); // NO by default
#endif
// 当前项是否可以被聚焦
@property (readonly, nonatomic, getter=isFocused) BOOL focused NS_AVAILABLE_IOS(9_0);
// 左右滑动翻转效果
@property (nonatomic) UISemanticContentAttribute semanticContentAttribute NS_AVAILABLE_IOS(9_0);
// 返回界面的方向
+ (UIUserInterfaceLayoutDirection)userInterfaceLayoutDirectionForSemanticContentAttribute:(UISemanticContentAttribute)attribute NS_AVAILABLE_IOS(9_0);
// 返回相对于指定视图的界面方向
+(UIUserInterfaceLayoutDirection)userInterfaceLayoutDirectionForSemanticContentAttribute:(UISemanticContentAttribute)semanticContentAttribute relativeToLayoutDirection:(UIUserInterfaceLayoutDirection)layoutDirection NS_AVAILABLE_IOS(10_0);
// 安排即时内容的布局的方向
@property (readonly, nonatomic) UIUserInterfaceLayoutDirection effectiveUserInterfaceLayoutDirection NS_AVAILABLE_IOS(10_0);
@end
@interface UIView(UIViewGeometry)
// 父视图位置(参照点是,父view坐标系统)
@property(nonatomic) CGRect frame;
// 该view在本地坐标系统中的位置和大小(参照点是,本地坐标系统)
@property(nonatomic) CGRect bounds;
// frame中的中心点(决定当前视图是否是处理触摸事件的唯一对象)
@property(nonatomic) CGPoint center;
// 视图变换
@property(nonatomic) CGAffineTransform transform;
// 视图内容的缩放比例
@property(nonatomic) CGFloat contentScaleFactor NS_AVAILABLE_IOS(4_0);
// 支持多点触控
@property(nonatomic,getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled __TVOS_PROHIBITED; // default is NO
// 决定当前视图是否处理出门事件的唯一对象
@property(nonatomic,getter=isExclusiveTouch) BOOL exclusiveTouch __TVOS_PROHIBITED; // default is NO
// 在指定点上点击测试指定事件
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;
// 测试指定的点是否包含在接收对象中
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds
// 转换视图间坐标
// 转换一个点从接受对象的坐标系到指定视图
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
// 与上面相反,指定视图坐标中的一个点转换为接收对象
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
// 将当前的矩形坐标空间转换到指定的矩形坐标空间
- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
// 将指定的矩形坐标空间转换到当前的矩形坐标空间
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;
// 自动尺寸调整
@property(nonatomic) BOOL autoresizesSubviews; // default is YES. if set, subviews are adjusted according to their autoresizingMask if self.bounds changes
// 自动调整子控件与父控件中间的位置,宽高
@property(nonatomic) UIViewAutoresizing autoresizingMask;
// 计算并返回的大小最适合它的子视图的视图。(让视图计算最适合子视图的大小,即能把全部子视图显示出来所需要的最小的size)
- (CGSize)sizeThatFits:(CGSize)size;
// 得到最适合当前包含它子视图的尺寸
- (void)sizeToFit;
@end
@interface UIView(UIViewHierarchy)
// 当前视图的父视图
@property(nullable, nonatomic,readonly) UIView *superview;
// 当前视图的所有子视图
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
// 当前视图上的UIWindow
@property(nullable, nonatomic,readonly) UIWindow *window;
// 从父视图中移除
- (void)removeFromSuperview;
// 在指定的位置插入子视图,视图的所有视图其实组成了一个数组
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
// 交换两子视图的位置
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;
// 添加视图
- (void)addSubview:(UIView *)view;
// 将指定的子视图移动到指定siblingSubview子视图的后面
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
// 将指定的子视图移动到指定siblingSubview子视图的前面
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
// 移动指定的子视图到最顶层
- (void)bringSubviewToFront:(UIView *)view;
// 移动制定的子视图到后方,所有子视图的下面
- (void)sendSubviewToBack:(UIView *)view;
// 通知视图指定子视图已经添加
- (void)didAddSubview:(UIView *)subview;
// 通知视图将要移除指定的子视图
- (void)willRemoveSubview:(UIView *)subview;
// 通知视图将要移动到一个新的父视图中
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
// 通知视图已经移动到一个新的父视图中
- (void)didMoveToSuperview;
// 通知视图将要移动到一个新的window中
- (void)willMoveToWindow:(nullable UIWindow *)newWindow;
// 通知视图已经移动到一个新的window中
- (void)didMoveToWindow;
// 判断接收对象是否是指定视图的子视图,或与指定视图是同一视图
- (BOOL)isDescendantOfView:(UIView *)view; // returns YES for self.
// 返回指定标签匹配到的视图
- (nullable __kindof UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self
// 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
- (void)setNeedsLayout;
// 如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)
- (void)layoutIfNeeded;
// 将子类重新布局
- (void)layoutSubviews;
// 设置视图的间距
@property (nonatomic) UIEdgeInsets layoutMargins NS_AVAILABLE_IOS(8_0);
// 是否将当前视图的间距和父视图相同
@property (nonatomic) BOOL preservesSuperviewLayoutMargins NS_AVAILABLE_IOS(8_0); // default is NO
// 通知布局发生变化
- (void)layoutMarginsDidChange NS_AVAILABLE_IOS(8_0);
// 视图间距引导
@property(readonly,strong) UILayoutGuide *layoutMarginsGuide NS_AVAILABLE_IOS(9_0);
/// 获取此区域的内的布局引导
@property (nonatomic, readonly, strong) UILayoutGuide *readableContentGuide NS_AVAILABLE_IOS(9_0);
@end
@interface UIView(UIViewRendering)
// 在指定的区域绘画视图
- (void)drawRect:(CGRect)rect;
// 标记整个视图的边界矩形需要重绘
- (void)setNeedsDisplay;
// 标记在指定区域内的视图的边界需要重绘
- (void)setNeedsDisplayInRect:(CGRect)rect;
// 决定子视图是否被限定在当前视图的bounds中
@property(nonatomic) BOOL clipsToBounds; //Default is NO.
// 背景色
@property(nullable, nonatomic,copy) UIColor *backgroundColor UI_APPEARANCE_SELECTOR;
// 透明度
@property(nonatomic) CGFloat alpha; // animatable. default is 1.0
// 不透明度
@property(nonatomic,getter=isOpaque) BOOL opaque; // default is YES.
// 决定在视图重画之前是否先清理视图以前的内容
@property(nonatomic) BOOL clearsContextBeforeDrawing; // default is YES.
// 是否隐藏视图
@property(nonatomic,getter=isHidden) BOOL hidden; // default is NO.
// 视图内容风格
@property(nonatomic) UIViewContentMode contentMode; // default is UIViewContentModeScaleToFill
// 一个可选视图,用于屏蔽视图内容
@property(nullable, nonatomic,strong) UIView *maskView NS_AVAILABLE_IOS(8_0);
// 最底部视图色彩
@property(null_resettable, nonatomic, strong) UIColor *tintColor NS_AVAILABLE_IOS(7_0);
// 色彩调整风格
@property(nonatomic) UIViewTintAdjustmentMode tintAdjustmentMode NS_AVAILABLE_IOS(7_0);
// 告诉系统tintColor值将会改变
- (void)tintColorDidChange NS_AVAILABLE_IOS(7_0);
@end
@interface UIView(UIViewAnimation)
// 标记开始/提交动画块的开始
+ (void)beginAnimations:(nullable NSString *)animationID context:(nullable void *)context;
// 标记开始/提交动画块的结束,并为执行调度动画
+ (void)commitAnimations;
// 设置动画消息的委托
+ (void)setAnimationDelegate:(nullable id)delegate; // default = nil
// 设置动画启动时发送给动画委托的消息
+ (void)setAnimationWillStartSelector:(nullable SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context
// 设置动画停止时发送给动画委托的消息
+ (void)setAnimationDidStopSelector:(nullable SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
// 设置动画持续时间
+ (void)setAnimationDuration:(NSTimeInterval)duration; // default = 0.2
// 设置动画延迟执行时间
+ (void)setAnimationDelay:(NSTimeInterval)delay; // default = 0.0
// 设置动画开始时间
+ (void)setAnimationStartDate:(NSDate *)startDate; // default = now ([NSDate date])
// 设置动画曲线
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // default = UIViewAnimationCurveEaseInOut
// 设置动画重复次数
+ (void)setAnimationRepeatCount:(float)repeatCount; // default = 0.0.
// 设置动画是否反转执行
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO.
// 设置动画是否从当前状态开始播放
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO.
// 设置到指定视图的过渡动画
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;
// 设置是否启用了动画
+ (void)setAnimationsEnabled:(BOOL)enabled;
// 是否启用了动画
#if UIKIT_DEFINE_AS_PROPERTIES
@property(class, nonatomic, readonly) BOOL areAnimationsEnabled;
#else
+ (BOOL)areAnimationsEnabled;
#endif
// 禁用视图的过渡动画
+ (void)performWithoutAnimation:(void (NS_NOESCAPE ^)(void))actionsWithoutAnimation NS_AVAILABLE_IOS(7_0);
// 当前动画的持续时间
#if UIKIT_DEFINE_AS_PROPERTIES
@property(class, nonatomic, readonly) NSTimeInterval inheritedAnimationDuration NS_AVAILABLE_IOS(9_0);
#else
+ (NSTimeInterval)inheritedAnimationDuration NS_AVAILABLE_IOS(9_0);
#endif
@end
@interface UIView(UIViewAnimationWithBlocks)
// 用于对一个或多个视图的改变的持续时间、延时、选项动画完成时的操作
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
// 用于对一个或多个视图的改变的持续时间、选项动画完成时的操作
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^ __nullable)(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 (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
// 为指定的容器视图创建转换动画
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
// 使用给定的参数在指定视图之间创建转换动画
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
// 在一个或多个视图上执行指定的系统提供的动画,以及定义的可选并行动画.
+ (void)performSystemAnimation:(UISystemAnimation)animation onViews:(NSArray<__kindof UIView *> *)views options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))parallelAnimations completion:(void (^ __nullable)(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 (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
// 添加指定开始时间、持续时间的关键帧动画
+ (void)addKeyframeWithRelativeStartTime:(double)frameStartTime relativeDuration:(double)frameDuration animations:(void (^)(void))animations NS_AVAILABLE_IOS(7_0);
@end
@interface UIView (UIViewGestureRecognizers)
// 当前视图所附加的手势识别器
@property(nullable, nonatomic,copy) NSArray<__kindof UIGestureRecognizer *> *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<__kindof UIMotionEffect *> *motionEffects NS_AVAILABLE_IOS(7_0);
@end
@interface UIView (UIConstraintBasedLayoutInstallingConstraints)
// 视图所持有的约束
@property(nonatomic,readonly) NSArray<__kindof NSLayoutConstraint *> *constraints NS_AVAILABLE_IOS(6_0);
// 添加一个约束
- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0);
// 添加多个约束
- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints NS_AVAILABLE_IOS(6_0);
// 移除视图上指定的约束
- (void)removeConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0);
// 移除指定的一组约束
- (void)removeConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints NS_AVAILABLE_IOS(6_0);
@end
@interface UIView (UIConstraintBasedLayoutCoreMethods)
// 更新视图和其子视图的约束
- (void)updateConstraintsIfNeeded NS_AVAILABLE_IOS(6_0);
// 为视图更新约束
- (void)updateConstraints NS_AVAILABLE_IOS(6_0) NS_REQUIRES_SUPER;
// 视图的约束是否需要更新
- (BOOL)needsUpdateConstraints NS_AVAILABLE_IOS(6_0);
// 设置视图的约束需要更新
- (void)setNeedsUpdateConstraints NS_AVAILABLE_IOS(6_0);
@end
@interface UIView (UIConstraintBasedCompatibility)
// 是否自动尺寸转换为自动布局
@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints NS_AVAILABLE_IOS(6_0); // Default YES
// 视图是否一来与基础自动布局的约束
#if UIKIT_DEFINE_AS_PROPERTIES
@property(class, nonatomic, readonly) BOOL requiresConstraintBasedLayout NS_AVAILABLE_IOS(6_0);
#else
+ (BOOL)requiresConstraintBasedLayout NS_AVAILABLE_IOS(6_0);
#endif
@end
@interface UIView (UIConstraintBasedLayoutLayering)
// 返回给定框架的视图的对齐矩阵
- (CGRect)alignmentRectForFrame:(CGRect)frame NS_AVAILABLE_IOS(6_0);
// 返回给定对齐矩形的视图的frame
- (CGRect)frameForAlignmentRect:(CGRect)alignmentRect NS_AVAILABLE_IOS(6_0);
// 返回从视图的frame上定义的对齐矩阵的边框
#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic, readonly) UIEdgeInsets alignmentRectInsets NS_AVAILABLE_IOS(6_0);
#else
- (UIEdgeInsets)alignmentRectInsets NS_AVAILABLE_IOS(6_0);
#endif
// 返回满足基线约束条件的视图
- (UIView *)viewForBaselineLayout NS_DEPRECATED_IOS(6_0, 9_0, "Override -viewForFirstBaselineLayout or -viewForLastBaselineLayout as appropriate, instead") __TVOS_PROHIBITED;
// 返回用于满足第一基线约束的视图
@property(readonly,strong) UIView *viewForFirstBaselineLayout NS_AVAILABLE_IOS(9_0);
// 返回用于满足上次基线约束的视图
@property(readonly,strong) UIView *viewForLastBaselineLayout NS_AVAILABLE_IOS(9_0);
UIKIT_EXTERN const CGFloat UIViewNoIntrinsicMetric NS_AVAILABLE_IOS(6_0); // -1
// 返回接收对象的原本大小
#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic, readonly) CGSize intrinsicContentSize NS_AVAILABLE_IOS(6_0);
#else
- (CGSize)intrinsicContentSize NS_AVAILABLE_IOS(6_0);
#endif
// 废除视图原本内容的size
- (void)invalidateIntrinsicContentSize NS_AVAILABLE_IOS(6_0);
// 设置当视图要变大时,视图的压缩改变方式,返回一个优先权(确定view有多大的优先级阻止自己变大)
- (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)
// 返回满足持有约束的视图的size
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize NS_AVAILABLE_IOS(6_0);
// 返回满足它所包含的约束的视图的大小
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority NS_AVAILABLE_IOS(8_0);
@end
@interface UIView (UILayoutGuideSupport)
// 此视图拥有布局向导对象的数组
@property(nonatomic,readonly,copy) NSArray<__kindof UILayoutGuide *> *layoutGuides NS_AVAILABLE_IOS(9_0);
// 向视图中添加布局向导
- (void)addLayoutGuide:(UILayoutGuide *)layoutGuide NS_AVAILABLE_IOS(9_0);
// 移除视图中的布局向导
- (void)removeLayoutGuide:(UILayoutGuide *)layoutGuide NS_AVAILABLE_IOS(9_0);
@end
@class NSLayoutXAxisAnchor,NSLayoutYAxisAnchor,NSLayoutDimension;
@interface UIView (UIViewLayoutConstraintCreation)
// 布局视图的前缘框的布局锚点
@property(readonly, strong) NSLayoutXAxisAnchor *leadingAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的后缘边框的布局锚点
@property(readonly, strong) NSLayoutXAxisAnchor *trailingAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的左边框的布局锚点
@property(readonly, strong) NSLayoutXAxisAnchor *leftAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的右边框的布局锚点
@property(readonly, strong) NSLayoutXAxisAnchor *rightAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的顶边框的布局锚点
@property(readonly, strong) NSLayoutYAxisAnchor *topAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的底边框的布局锚点
@property(readonly, strong) NSLayoutYAxisAnchor *bottomAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的宽度
@property(readonly, strong) NSLayoutDimension *widthAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的高度
@property(readonly, strong) NSLayoutDimension *heightAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的水平中心轴
@property(readonly, strong) NSLayoutXAxisAnchor *centerXAnchor NS_AVAILABLE_IOS(9_0);
// 布局视图的垂直中心轴
@property(readonly, strong) NSLayoutYAxisAnchor *centerYAnchor NS_AVAILABLE_IOS(9_0);
// 一个代表对视图中的文本的最高线基线布置锚
@property(readonly, strong) NSLayoutYAxisAnchor *firstBaselineAnchor NS_AVAILABLE_IOS(9_0);
// 一个代表对视图中的文本的最低线基线布置锚
@property(readonly, strong) NSLayoutYAxisAnchor *lastBaselineAnchor NS_AVAILABLE_IOS(9_0);
@end
@interface UIView (UIConstraintBasedLayoutDebugging)
// 返回影响一个给定轴视图布局的约束
- (NSArray<__kindof NSLayoutConstraint *> *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
// 视图的位置是否不完全指定
#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic, readonly) BOOL hasAmbiguousLayout NS_AVAILABLE_IOS(6_0);
#else
- (BOOL)hasAmbiguousLayout NS_AVAILABLE_IOS(6_0);
#endif
// 在不同的有效值之间用一个模糊的布局随机改变视图的frame
- (void)exerciseAmbiguityInLayout NS_AVAILABLE_IOS(6_0);
@end
@interface UILayoutGuide (UIConstraintBasedLayoutDebugging)
// 返回对给定轴影响视图布局的约束
- (NSArray<__kindof NSLayoutConstraint *> *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(10_0);
// 确定影响视图布局的约束是否完全指定视图的位置
#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic, readonly) BOOL hasAmbiguousLayout NS_AVAILABLE_IOS(10_0);
#else
- (BOOL)hasAmbiguousLayout NS_AVAILABLE_IOS(10_0);
#endif
@end
@interface UIView (UIStateRestoration)
// 该标示符决定该视图是否支持恢复状态
@property (nullable, 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
@interface UIView (UISnapshotting)
// 根据当前视图的内容返回快照视图
- (nullable UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
// 返回一个基于当前视图指定内容的快照视图,可插入
- (nullable UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(7_0);
// 呈现一个快照的完整视图层次可见屏幕为当前上下文
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// 动画效果
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
UIViewAnimationCurveEaseInOut, // 淡入淡出
UIViewAnimationCurveEaseIn, // 淡入
UIViewAnimationCurveEaseOut, // 淡出
UIViewAnimationCurveLinear,
};
// 视图内容风格
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill, // 缩放内容到合适比例大小
UIViewContentModeScaleAspectFit, // 缩放内容到合适的大小,边界多余部分透明
UIViewContentModeScaleAspectFill, // 缩放内容填充到指定大小,边界多余的部分省略.
UIViewContentModeRedraw, // 重绘视图边界 (需调用 -setNeedsDisplay)
UIViewContentModeCenter, // 视图保持等比缩放
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, // 开启交互动画
UIViewAnimationOptionBeginFromCurrentState = 1 << 2, // 从当前值开始动画
UIViewAnimationOptionRepeat = 1 << 3, // 无限重复
UIViewAnimationOptionAutoreverse = 1 << 4, // 自动来回
UIViewAnimationOptionOverrideInheritedDuration = 1 << 5, // 忽略嵌套的动画的时间
UIViewAnimationOptionOverrideInheritedCurve = 1 << 6, // 忽略嵌套的路径动画
UIViewAnimationOptionAllowAnimatedContent = 1 << 7, // 只执行过渡动画
UIViewAnimationOptionShowHideTransitionViews = 1 << 8, // 隐藏或展示过渡动画视图
UIViewAnimationOptionOverrideInheritedOptions = 1 << 9, // 不继承任何动画类型
// 同上
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, // 开启交互动画
UIViewKeyframeAnimationOptionBeginFromCurrentState = UIViewAnimationOptionBeginFromCurrentState, // 从当前值开始动画
UIViewKeyframeAnimationOptionRepeat = UIViewAnimationOptionRepeat, // 无限重复
UIViewKeyframeAnimationOptionAutoreverse = UIViewAnimationOptionAutoreverse, // 自动来回
UIViewKeyframeAnimationOptionOverrideInheritedDuration = UIViewAnimationOptionOverrideInheritedDuration, // 忽略嵌套的动画的时间
UIViewKeyframeAnimationOptionOverrideInheritedOptions = UIViewAnimationOptionOverrideInheritedOptions, // 不继承任何动画类型
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, // 完成时从视图中删除
} NS_ENUM_AVAILABLE_IOS(7_0);
// 色彩调整风格
typedef NS_ENUM(NSInteger, UIViewTintAdjustmentMode) {
UIViewTintAdjustmentModeAutomatic, // 与父视图相同
UIViewTintAdjustmentModeNormal, // 未经修改的
UIViewTintAdjustmentModeDimmed, // 饱和、暗淡的原始色
} NS_ENUM_AVAILABLE_IOS(7_0);
// 左右切换或左右布局
typedef NS_ENUM(NSInteger, UISemanticContentAttribute) {
UISemanticContentAttributeUnspecified = 0, // 左右切换时视图翻转
UISemanticContentAttributePlayback, // 音乐播放按钮设置,左右切换此视图不会翻转
UISemanticContentAttributeSpatial, // 控件方向不能改变
UISemanticContentAttributeForceLeftToRight, // 从左到右布局
UISemanticContentAttributeForceRightToLeft // 从右到左布局
} NS_ENUM_AVAILABLE_IOS(9_0);
// 约束布局中心线类型
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
UILayoutConstraintAxisHorizontal = 0, // 以水平线为中心
UILayoutConstraintAxisVertical = 1 // 以垂直线为中心
};