UIView 半解(1)

原文:cyrill's blog

//
//  UIView.h
//  UIKit
//
//  Copyright (c) 2005-2017 Apple Inc. All rights reserved.
//

// 基础框架入口
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIResponder.h>
#import <UIKit/UIInterface.h>
#import <UIKit/UIKitDefines.h>
#import <UIKit/UIAppearance.h>
#import <UIKit/UIDynamicBehavior.h>
#import <UIKit/NSLayoutConstraint.h>
#import <UIKit/UITraitCollection.h>
#import <UIKit/UIFocus.h>

// ------------------------------------------------------------------------------------
// UIViewAnimationCurve设置动画块中的动画属性变化的曲线
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    // slow at beginning and end  缓入缓出,中间快
    UIViewAnimationCurveEaseInOut,
    // slow at beginning 由慢到特别快(缓入快出)
    UIViewAnimationCurveEaseIn,
    // slow at end 由快到慢(快入缓出)
    UIViewAnimationCurveEaseOut,
    // 动画匀速执行,默认值。
    UIViewAnimationCurveLinear
};

// ------------------------------------------------------------------------------------
typedef NS_ENUM(NSInteger, UIViewContentMode) {
    // 伸缩至高度及宽度与UIView的大小一致,默认值
    UIViewContentModeScaleToFill,
    // contents scaled to fit with fixed aspect. remainder is transparent
    // 在不超出UIView尺寸范围内,且不改变比例的情况下伸缩至最大尺寸,边界多余部分透明
    UIViewContentModeScaleAspectFit,
    // contents scaled to fill with fixed aspect. some portion of content may be clipped.
    // 超出UIView的高度或者宽度,伸缩至不改变比例的最大尺寸,边界多余的部分可能会被剪切掉
    UIViewContentModeScaleAspectFill,
    // redraw on bounds change (calls -setNeedsDisplay) 重绘视图边界
    UIViewContentModeRedraw,
    // contents remain same size. positioned adjusted. 视图保持等比缩放
    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,
    // 自动调整与superView左边的距离,保证与superView右边的距离不变
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    // 自动调整自己的宽度,保证与superView左边和右边的距离不变
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    // 自动调整与superView右边的距离,保证与superView左边的距离不变
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    // 自动调整与superView顶部的距离,保证与superView底部的距离不变
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    // 自动调整自己的宽度,保证与superView上边和下边的距离不变
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    // 自动调整与superView底部的距离,保证与superView顶部的距离不变
    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
    // 忽略嵌套动画速度设置 通过改变属性和重绘实现动画效果,如果key没有提交动画将使用快照
    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,
    
    // 默认的帧每秒.
    UIViewAnimationOptionPreferredFramesPerSecondDefault     = 0 << 24,
    // 60帧每秒的帧速率.
    UIViewAnimationOptionPreferredFramesPerSecond60          = 3 << 24,
    // 30帧每秒的帧速率.
    UIViewAnimationOptionPreferredFramesPerSecond30          = 7 << 24,
} 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, //tintColor的默认值会自动变得模糊
} NS_ENUM_AVAILABLE_IOS(7_0);

// ------------------------------------------------------------------------------------
typedef NS_ENUM(NSInteger, UISemanticContentAttribute) {
    // 未指定,默认值
    UISemanticContentAttributeUnspecified = 0,
    //  打开/ RW / FF等播放控制按钮
    UISemanticContentAttributePlayback, // for playback controls such as Play/RW/FF buttons and playhead scrubbers
    // 控制导致某种形式的定向改变UI中,如分段控制文本对齐方式或在游戏中方向键
    UISemanticContentAttributeSpatial, // for controls that result in some sort of directional change in the UI, e.g. a segmented control for text alignment or a D-pad in a game
    // 视图总是从左向右布局.
    UISemanticContentAttributeForceLeftToRight,
    // 视图总是从又向左布局.
    UISemanticContentAttributeForceRightToLeft
} NS_ENUM_AVAILABLE_IOS(9_0);

// ------------------------------------------------------------------------------------
// 坐标系空间相关的协议
@protocol UICoordinateSpace <NSObject>

/** 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 */
- (CGPoint)convertPoint:(CGPoint)point toCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
/** 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 */
- (CGPoint)convertPoint:(CGPoint)point fromCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
/** 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect */
- (CGRect)convertRect:(CGRect)rect toCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);
/** 将rect从view中转换到当前视图中,返回在当前视图中的rect */
- (CGRect)convertRect:(CGRect)rect fromCoordinateSpace:(id <UICoordinateSpace>)coordinateSpace NS_AVAILABLE_IOS(8_0);

/** 获取bounds 只读 */
@property (readonly, nonatomic) CGRect bounds NS_AVAILABLE_IOS(8_0);

@end

@class UIBezierPath, UIEvent, UIWindow, UIViewController, UIColor, UIGestureRecognizer, UIMotionEffect, CALayer, UILayoutGuide;

// UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。UIView本身完全是由CoreAnimation来实现的。它真正的绘图部分是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和坐标有关的属性,如frame,bounds等,而内部都是在访问它所包含的CALayer的相关属性。
// UIView继承自UIResponder UIResponder是所有事件的响应基石。

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, CALayerDelegate>

#if UIKIT_DEFINE_AS_PROPERTIES
@property(class, nonatomic, readonly) Class layerClass;                        // default is [CALayer class]. Used when creating the underlying layer for the view.
#else
// UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类可以通过重载这个方法来让UIView使用不同的CALayer来显示
+ (Class)layerClass;   // default is [CALayer class]. Used when creating the underlying layer for the view.
#endif


// 当从代码实例化UIView的时候,initWithFrame会执行;
// 当从文件加载UIView的时候,initWithCoder会执行。
// 初始化方法并且给一个frame
- (instancetype)initWithFrame:(CGRect)frame;          // default initializer

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

// 是否接受用户点击 getter=isUserInterractionEnabled 重构getter方法
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled;  // default is YES. if set to NO, user events (touch, keys) are ignored and removed from the event queue.
// 给UIView加一个tag默认是0
@property(nonatomic)                                 NSInteger tag;                // default is 0
// 返回view的layer
@property(nonatomic,readonly,retain)                 CALayer  *layer;              // returns view's layer. Will always return a non-nil value. view is layer's delegate


/** 返回是否可以成为焦点, 默认NO */
#if UIKIT_DEFINE_AS_PROPERTIES
@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);

/** 获取视图的方向 */
// This method returns the layout direction implied by the provided semantic content attribute relative to the application-wide layout direction (as returned by UIApplication.sharedApplication.userInterfaceLayoutDirection).
+ (UIUserInterfaceLayoutDirection)userInterfaceLayoutDirectionForSemanticContentAttribute:(UISemanticContentAttribute)attribute NS_AVAILABLE_IOS(9_0);

/** 获取相对于指定视图的界面方向 */
// This method returns the layout direction implied by the provided semantic content attribute relative to the provided layout direction. For example, when provided a layout direction of RightToLeft and a semantic content attribute of Playback, this method returns LeftToRight. Layout and drawing code can use this method to determine how to arrange elements, but might find it easier to query the container view’s effectiveUserInterfaceLayoutDirection property instead.
+ (UIUserInterfaceLayoutDirection)userInterfaceLayoutDirectionForSemanticContentAttribute:(UISemanticContentAttribute)semanticContentAttribute relativeToLayoutDirection:(UIUserInterfaceLayoutDirection)layoutDirection NS_AVAILABLE_IOS(10_0);

/** 返回即时内容的布局的方向 */
// Returns the user interface layout direction appropriate for arranging the immediate content of this view. Always consult the effectiveUserInterfaceLayoutDirection of the view whose immediate content is being arranged or drawn. Do not assume that the value propagates through the view’s subtree.
@property (readonly, nonatomic) UIUserInterfaceLayoutDirection effectiveUserInterfaceLayoutDirection NS_AVAILABLE_IOS(10_0);


@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容