UIView详解
UIView詳解(http://www.beyondabel.com/blog/2014/01/01/uiview/)
引言
UIView表示屏幕上的一塊矩形區(qū)域,它在App中占有絕對(duì)重要的地位,因?yàn)閕OS中幾乎所有可視化控件都是UIView的子類。負(fù)責(zé)渲染區(qū)域的內(nèi)容,并且響應(yīng)該區(qū)域內(nèi)發(fā)生的觸摸事件
目錄
- 1、UIView家族
- 2、UIView的基本屬性
- 3、幾何方法類
- 4、控制級(jí)別類
- 5、渲染類
- 6、動(dòng)畫(huà)類
- 7、手勢(shì)類
- 8、移動(dòng)效果類
- 9、基于布局約束類(iOS6.0)
- 10、基于布局的約束core方法(iOS 6.0)
- 11、基于約束的兼容性(iOS 6.0)
- 12、層次布局的約束(iOS 6.0)
- 13、設(shè)備大小布局約束(iOS 6.0)
- 14、布局調(diào)度(iOS 6.0)
- 15、狀態(tài)恢復(fù)(iOS 6.0)
- 16、快照 (iOS7.0)
1、UIView家族
下圖就是視圖的內(nèi)層次
2、UIView的基本屬性
// UIView是否接受events事件,默認(rèn)為YES
BOOL userInteractionEnabled;// 用于做標(biāo)識(shí)所用,默認(rèn)為0
NSInteger tag;// Core Animation layer有關(guān),在常用方法中再詳細(xì)講解
CALayer *layer;// UIView在父視圖中的位置 如果是在變形的時(shí)候不要用frame,使用bounds和center屬性
CGRect frame;// UIView相對(duì)自己的位置 bounds的原點(diǎn)就是子視圖的原點(diǎn)
CGRect bounds;// UIView的中心點(diǎn). animatable
CGPoint center;// 線性代數(shù)里面講的矩陣變換,這個(gè)是恒等變換,一般用來(lái)旋轉(zhuǎn),縮放
CGAffineTransform transform;// 修改contentScaleFactor可以讓UIView的渲染精度提高,這樣即使在CGAffineTransform放大之后仍然能保持銳利。
CGFloat contentScaleFactor;// 是否允許多點(diǎn)觸摸
BOOL multipleTouchEnabled;// default is NO?決定當(dāng)前視圖是否是處理觸摸事件的唯一對(duì)象
BOOL exclusiveTouch;UIView 的exclusiveTouch屬性
exclusiveTouch的意思是UIView會(huì)獨(dú)占整個(gè)Touch事件,具體的來(lái)說(shuō),就是當(dāng)設(shè)置了exclusiveTouch的 UIView是事件的第一響應(yīng)者,那么到你的所有手指離開(kāi)前,其他的視圖UIview是不會(huì)響應(yīng)任何觸摸事件的,對(duì)于多點(diǎn)觸摸事件,這個(gè)屬性就非常重要,值得注意的是:手勢(shì)識(shí)別(GestureRecognizers)會(huì)忽略此屬性。
列舉用途:我們知道ios是沒(méi)有GridView視圖的,通常做法是在UITableView的cell上加載幾個(gè)子視圖,來(lái)模擬實(shí)現(xiàn) GridView視圖,但對(duì)于每一個(gè)子視圖來(lái)說(shuō),就需要使用exclusiveTouch,否則當(dāng)同時(shí)點(diǎn)擊多個(gè)子視圖,那么會(huì)觸發(fā)每個(gè)子視圖的事件。當(dāng)然 還有我們常說(shuō)的模態(tài)對(duì)話框。
// UIView的背影顏色
UIColor backgroundColor;// UIView是否隱藏
BOOL hidden;// 為0時(shí)完全透明,為1時(shí)完全不透明。
CGFloat alpha;//在類的層次結(jié)構(gòu)中,如果clipsTobounds設(shè)為YES,超出superView的部分subview就不會(huì)顯示,否則會(huì)做顯示, 默認(rèn)情況下是NO。
BOOL clipsToBounds;//這是一個(gè)優(yōu)化屬性,如果該值為YES, 那么繪圖在繪制該視圖的時(shí)候把整個(gè)視圖當(dāng)作不透明對(duì)待。這樣,繪圖系統(tǒng)在執(zhí)行繪圖過(guò)程中會(huì)優(yōu)化一些操作并提升系統(tǒng)性能;如果是設(shè)置為NO, 繪圖系統(tǒng)將其和其他內(nèi)容平等對(duì)待,不去做優(yōu)化操作。為了性能方面的考量,默認(rèn)被置為YES(意味著‘優(yōu)化’)。
BOOL opaque; UIView *superview;// 父視圖 NSArray *subviews;// 子視圖注:frame和center都是相對(duì)于父視圖的,bounds是相對(duì)于自身的。當(dāng)view完全透明和隱藏時(shí)不能響應(yīng)事件。
opaque和alpha 是有關(guān)系的。 一個(gè)不透明視圖需要整個(gè)邊界里面的內(nèi)容都是不透明的。基于這個(gè)原因,opaque設(shè)置為YES,要求對(duì)應(yīng)的alpha必須為1.0。如果一個(gè)UIView實(shí)例opaque被設(shè)置為YES, 而同時(shí)它又沒(méi)有完全填充它的邊界(bounds),或者它包含了整個(gè)或部分的透明的內(nèi)容視圖,那么將會(huì)導(dǎo)致未知的結(jié)果。 因此,如果視圖部分或全部支持透明,那么你必須把opaque這個(gè)值設(shè)置為NO.
?
CGRect?contentStretch 拉伸圖片屬性,已棄用。用?[UIImage resizableImageWithCapInsets:]代替。
?
?
?
3、幾何方法類
// hitTest主要用途是用來(lái)尋找那個(gè)視圖是被觸摸了
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;// 如果我們不想讓某個(gè)視圖響應(yīng)事件,讓此方法返回NO就行了。默認(rèn)為YES
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;舉個(gè)例子,建立一個(gè)TestView里面重載hitTest和pointInside方法:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{[super hitTest:point withEvent:event];return self; } - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{NSLog(@"view pointInside");return YES; }然后在TestView中增加一個(gè)子視圖TestSecondView也重載這兩個(gè)方法
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{[super hitTest:point withEvent:event]; return self; } - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{NSLog(@"second view pointInside");return YES; }這里注意[super hitTest:point withEvent:event];必須要包括,否則hitTest無(wú)法調(diào)用父類的方法,這樣就沒(méi)法 使用PointInside:withEvent:進(jìn)行判斷,那么就沒(méi)法進(jìn)行子視圖的遍歷。當(dāng)去掉這個(gè)語(yǔ)句的時(shí)候,觸摸事件就不可能進(jìn)到子視圖中了,除非你在方法中直接返回子視圖的對(duì)象。這樣你在調(diào)試的過(guò)程中就會(huì)發(fā)現(xiàn),每次你點(diǎn)擊一個(gè)view都會(huì)先進(jìn)入到這個(gè)view的父視圖中的hitTest方法,然后 調(diào)用super的hitTest方法之后就會(huì)查找pointInside是否返回YES如果是,則就把消息傳遞個(gè)子視圖處理,子視圖用同樣的方法遞歸查找 自己的子視圖。所以從這里調(diào)試分析看,hitTest方法這種遞歸調(diào)用的方式就一目了然了。
// 將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;// 將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;// 將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;// 將rect從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;4、控制級(jí)別類
// 把視圖從父類移除 - (void)removeFromSuperview; // 添加子視圖到某個(gè)位置 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; // 更改子視圖的位置 - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;// 添加子視圖 - (void)addSubview:(UIView *)view; // 把view放在siblingSubview下面 - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; // 把view放在siblingSubview上面 - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;注:1、addSubview:和insertSubview: atIndex:的區(qū)別:
[view addSubView:oneView] == [view insertSubview:oneView atIndex:view.subviews.cout];// 將view顯示在最前面(要將一個(gè)view顯示在最前面,只要調(diào)用其父視圖的bringSubviewToFront:方法)
- (void)bringSubviewToFront:(UIView *)view;// 將view推送到背后
- (void)sendSubviewToBack:(UIView *)view;// 這個(gè)函數(shù)默認(rèn)是沒(méi)有做任何事情,子類可以重寫(xiě)這個(gè)函數(shù), 當(dāng)加入視圖完成后可以附加一些操作
- (void)didAddSubview:(UIView *)subview;// 將移除子視圖會(huì)調(diào)用
- (void)willRemoveSubview:(UIView *)subview;// 通知即將移動(dòng)到新的父視圖中
- (void)willMoveToSuperview:(UIView *)newSuperview;// 通知已經(jīng)到新父視圖
- (void)didMoveToSuperview;// 通知即將已移動(dòng)到新的窗口
- (void)willMoveToWindow:(UIWindow *)newWindow;// 通知已經(jīng)移動(dòng)新的窗口
- (void)didMoveToWindow;當(dāng)您為某個(gè)視圖添加子視圖時(shí),UIKit 會(huì)向相應(yīng)的父子視圖發(fā)送幾個(gè)消息,通知它們當(dāng)前發(fā)生的狀態(tài)變化。您可以在自己的定制視圖中對(duì)諸如?willMoveToSuperview: 、 willMoveToWindow: 、?willRemoveSubview: 、?didAddSubview: 、?didMoveToSuperview?、和?didMoveToWindow這樣的方法進(jìn)行重載,以便在事件發(fā)生的前后進(jìn)行必要的處理,并根據(jù)發(fā)生的變化更新視圖的狀態(tài)信息。
// 判斷一個(gè)視圖是否在父視圖層中
- (BOOL)isDescendantOfView:(UIView *)view;// 獲取標(biāo)記的子視圖
- (UIView *)viewWithTag:(NSInteger)tag;// 標(biāo)記為需要重新布局,異步調(diào)用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定會(huì)被調(diào)用
- (void)setNeedsLayout;// 如果有需要刷新的標(biāo)記,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒(méi)有標(biāo)記,不會(huì)調(diào)用layoutSubviews)
- (void)layoutIfNeeded;// 重新布局
- (void)layoutSubviews;5、渲染類
// 重寫(xiě)此方法,執(zhí)行重繪
- (void)drawRect:(CGRect)rect;// 標(biāo)記為需要重繪,異步調(diào)用drawRect
- (void)setNeedsDisplay;// 標(biāo)記為需要局部重繪
- (void)setNeedsDisplayInRect:(CGRect)rect;注:drawRect是對(duì)receiver的重繪。setNeedDisplay在receiver標(biāo)上一個(gè)需要被重新繪圖的標(biāo)記,在下一個(gè)draw周期自動(dòng)重繪,iphone device的刷新頻率是60hz,也就是1/60秒后重繪
6、動(dòng)畫(huà)類
// 開(kāi)始一個(gè)動(dòng)畫(huà)
+ (void)beginAnimations:(NSString *)animationID context:(void *)context;// 執(zhí)行動(dòng)畫(huà),類似數(shù)據(jù)庫(kù)的事務(wù)處理
+ (void)commitAnimations;// 設(shè)置動(dòng)畫(huà)代理,默認(rèn)為nil
+ (void)setAnimationDelegate:(id)delegate;// 當(dāng)動(dòng)畫(huà)執(zhí)行開(kāi)始時(shí),執(zhí)行selector方法,默認(rèn)為NULL
+ (void)setAnimationWillStartSelector:(SEL)selector;// 當(dāng)動(dòng)畫(huà)執(zhí)行結(jié)束時(shí),執(zhí)行selector方法
+ (void)setAnimationDidStopSelector:(SEL)selector;// 設(shè)置動(dòng)畫(huà)時(shí)間,時(shí)間參數(shù)為double類型,默認(rèn)0.2
+ (void)setAnimationDuration:(NSTimeInterval)duration;// 設(shè)置動(dòng)畫(huà)延遲時(shí)間
+ (void)setAnimationDelay:(NSTimeInterval)delay;// 設(shè)置在動(dòng)畫(huà)塊內(nèi)部動(dòng)畫(huà)內(nèi)部動(dòng)畫(huà)屬性改變的開(kāi)始時(shí)間
+ (void)setAnimationStartDate:(NSDate *)startDate;// 設(shè)置動(dòng)畫(huà)的旋轉(zhuǎn)曲度變化,默認(rèn)為UIViewAnimationCurveEaseInOut.值定義在UIViewAnimationCurve結(jié)構(gòu)體中。
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { //動(dòng)畫(huà)曲線// 緩慢開(kāi)始,中間加速,然后減速到結(jié)束UIViewAnimationCurveEaseInOut, // 緩慢開(kāi)始,加速到結(jié)束 UIViewAnimationCurveEaseIn, // 加速開(kāi)始,加速到結(jié)束 UIViewAnimationCurveEaseOut, //正常速度 UIViewAnimationCurveLinear }; + (void)setAnimationCurve:(UIViewAnimationCurve)curve;// 設(shè)置動(dòng)畫(huà)在動(dòng)畫(huà)模塊中的重復(fù)次數(shù)
+ (void)setAnimationRepeatCount:(float)repeatCount;// 設(shè)置動(dòng)畫(huà)塊中的動(dòng)畫(huà)效果是否自動(dòng)重復(fù)播放
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses;// 設(shè)置動(dòng)畫(huà)是否從當(dāng)前狀態(tài)開(kāi)始播放,默認(rèn)為NO.
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState;// 在動(dòng)畫(huà)設(shè)置過(guò)渡效果
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;transition把一個(gè)過(guò)渡效果應(yīng)用到視圖中。值定義在UIViewAnimationTransition結(jié)構(gòu)體中。
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {UIViewAnimationTransitionNone, 沒(méi)有過(guò)渡UIViewAnimationTransitionFlipFromLeft, 翻轉(zhuǎn)視圖從左到右UIViewAnimationTransitionFlipFromRight, 翻轉(zhuǎn)視圖從右到左UIViewAnimationTransitionCurlUp, 從上卷動(dòng)UIViewAnimationTransitionCurlDown, 從下卷動(dòng) };view:需要過(guò)渡的視圖對(duì)象。
cache:如果是YES,那么在開(kāi)始和結(jié)束圖片視圖渲染一次并在動(dòng)畫(huà)中創(chuàng)建幀;否則,視圖將會(huì)在每一幀都渲染。例如緩存,你不需要在視圖轉(zhuǎn)變中不停的更新,你只需要等到轉(zhuǎn)換完成再去更新視圖。
1、開(kāi)始一個(gè)動(dòng)畫(huà)塊。 2、在容器視圖中設(shè)置轉(zhuǎn)換。 3、在容器視圖中移除子視圖。 4、在容器視圖中添加子視圖。 5、結(jié)束動(dòng)畫(huà)塊。// 設(shè)置是否開(kāi)啟動(dòng)畫(huà),默認(rèn)YES,開(kāi)啟
+ (void)setAnimationsEnabled:(BOOL)enabled;// 驗(yàn)證動(dòng)畫(huà)是否開(kāi)啟,YES開(kāi)啟,NO關(guān)閉
+ (BOOL)areAnimationsEnabled;// iOS7之后替代 setAnimationsEnabled
+ (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation;// iOS4.0之后,動(dòng)畫(huà)效果處理塊
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;(NSTimeInterval)duration :動(dòng)畫(huà)時(shí)間
(NSTimeInterval)delay:延遲時(shí)間
(UIViewAnimationOptions)options 動(dòng)畫(huà)參數(shù)
typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) {UIViewAnimationOptionLayoutSubviews = 1 << 0,UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animatingUIViewAnimationOptionBeginFromCurrentState = 1 << 2, // start all views from current value, not initial valueUIViewAnimationOptionRepeat = 1 << 3, // repeat animation indefinitelyUIViewAnimationOptionAutoreverse = 1 << 4, // if repeat, run animation back and forthUIViewAnimationOptionOverrideInheritedDuration = 1 << 5, // ignore nested durationUIViewAnimationOptionOverrideInheritedCurve = 1 << 6, // ignore nested curveUIViewAnimationOptionAllowAnimatedContent = 1 << 7, // animate contents (applies to transitions only)UIViewAnimationOptionShowHideTransitionViews = 1 << 8, // flip to/from hidden state instead of adding/removingUIViewAnimationOptionCurveEaseInOut = 0 << 16, // defaultUIViewAnimationOptionCurveEaseIn = 1 << 16,UIViewAnimationOptionCurveEaseOut = 2 << 16,UIViewAnimationOptionCurveLinear = 3 << 16,UIViewAnimationOptionTransitionNone = 0 << 20, // defaultUIViewAnimationOptionTransitionFlipFromLeft = 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);(void))animations :動(dòng)畫(huà)效果塊
可以設(shè)置屬性如下:frame\bounds\center\transform\alpha\backgroundColor\contentStretch
completion:(void (^)(BOOL finished))completion 動(dòng)畫(huà)結(jié)束塊
例:
[UIView animateWithDuration: 2.00 delay:3.00 options:UIViewAnimationOptionAllowAnimatedContentanimations:^{insertDemoTwo.alpha = 0.1;insertDemoOne.alpha = 1.0;}completion:^(BOOL finished) {[UIView animateWithDuration:3.00animations:^{insertDemoTwo.center = CGPointMake(500.0, 470.0);insertDemoOne.center = CGPointMake(140.0, 100.0);}];}];// 動(dòng)畫(huà)效果處理(無(wú)延遲,無(wú)參數(shù))iOS4.0之后,默認(rèn)delay = 0.0,options = 0; + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;例:
[UIView animateWithDuration:3.00animations:^{insertDemoOne.alpha = 1.0;insertDemoTwo.alpha = 0.1;}completion:^(BOOL finished) {insertDemoTwo.center = CGPointMake(500.0, 470.0);insertDemoOne.center = CGPointMake(140.0, 100.0); }];//動(dòng)畫(huà)效果處理簡(jiǎn)單版 iOS4.0之后(delay = 0.0,options = 0,completion = NULL) + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;+ (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);// 過(guò)渡動(dòng)畫(huà)效果塊,iOS4.0 + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;例:
[UIView transitionWithView:insertDemoOne duration: 1.0 options:UIViewAnimationOptionTransitionFlipFromLeftanimations:^{[insertDemoTwo removeFromSuperview];[insertDemoOne addSubview:insertDemoTwo];}completion:^(BOOL finished) {insertDemoOne.backgroundColor = [UIColor brownColor];}];// 視圖之間切換的過(guò)渡動(dòng)畫(huà)效果塊,iOS4 + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;+ (void)performSystemAnimation:(UISystemAnimation)animation onViews:(NSArray *)views options:(UIViewAnimationOptions)options animations:(void (^)(void))parallelAnimations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);7、手勢(shì)類
// 手勢(shì)識(shí)別器(iOS3.2)
NSArray *gestureRecognizers;UIKit 中UIGestureRecognizer類的子類系列如下: UITapGestureRecognizer – “輕擊”手勢(shì)。可以配置為“單擊”和“連擊”的識(shí)別。 UIPinchGestureRecognizer –“捏合”手勢(shì)。該手勢(shì)通常用于縮放視圖或改變可視組件的大小。 UIPanGestureRecognizer – “平移”手勢(shì)。識(shí)別拖拽或移動(dòng)動(dòng)作。 UISwipeGestureRecognizer – “輕掃”手勢(shì)。當(dāng)用戶從屏幕上劃過(guò)時(shí)識(shí)別為該手勢(shì)。可以指定該動(dòng)作的方向(上、下、左、右)。 UIRotationGestureRecognizer – “轉(zhuǎn)動(dòng)”手勢(shì)。用戶兩指在屏幕上做相對(duì)環(huán)形運(yùn)動(dòng)。 UILongPressGestureRecognizer – “長(zhǎng)按”手勢(shì)。使用1指或多指觸摸屏幕并保持一定時(shí)間。// 綁定手勢(shì)到視圖(iOS3.2)
- (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;//從視圖中移除手勢(shì) (iOS3.2)
- (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;//手勢(shì)識(shí)別處理方式在gesture recognizer視圖轉(zhuǎn)出《UIGestureRecognizerStatePossible》狀態(tài)時(shí)調(diào)用,如果返回NO,則轉(zhuǎn)換到《UIGestureRecognizerStateFailed》;如果返回YES,則繼續(xù)識(shí)別觸摸序列.(默認(rèn)情況下為YES)。(iOS6.0)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;8、移動(dòng)效果類(iOS7.0)
- (void)addMotionEffect:(UIMotionEffect *)effect; - (void)removeMotionEffect:(UIMotionEffect *)effect;9、基于布局約束類(iOS6.0)
// 視圖布局約束
- (NSArray *)constraints;// 視圖布局上添加一個(gè)約束
- (void)addConstraint:(NSLayoutConstraint *)constraint;// 視圖布局上添加多個(gè)約束
- (void)addConstraints:(NSArray *)constraints;// 移除視力布局上的一個(gè)約束
- (void)removeConstraint:(NSLayoutConstraint *)constraint;// 移除視圖布局上的多個(gè)約束
- (void)removeConstraints:(NSArray *)constraints;10、基于布局的約束core方法(iOS 6.0)
// 調(diào)用新的視圖布局自動(dòng)觸發(fā),更新視圖布局上的約束
- (void)updateConstraintsIfNeeded;// 更新自定義視圖布局約束
- (void)updateConstraints;// 判斷視圖布局是否需要更新約束
- (BOOL)needsUpdateConstraints;// 設(shè)置視圖布局是否需要更新約束
- (void)setNeedsUpdateConstraints;11、基于約束的兼容性(iOS 6.0)
// 標(biāo)示是否自動(dòng)遵循視圖布局約束,默認(rèn)為YES
- (BOOL)translatesAutoresizingMaskIntoConstraints;// 設(shè)置是否自動(dòng)遵循視圖布局約束
- (void)setTranslatesAutoresizingMaskIntoConstraints:(BOOL)flag;// 返回是遵循自定義視圖布局約束
+ (BOOL)requiresConstraintBasedLayout NS_AVAILABLE_IOS(6_0);12、層次布局的約束(iOS 6.0)
// 返回矩形對(duì)于指定視圖框架
- (CGRect)alignmentRectForFrame:(CGRect)frame;// 返回框架對(duì)于指定視圖矩形
- (CGRect)frameForAlignmentRect:(CGRect)alignmentRect;// 返回自定義視圖大小
- (UIEdgeInsets)alignmentRectInsets;// 如果超出約束范圍,自動(dòng)生成基線限制,以滿足視圖需求
- (UIView *)viewForBaselineLayout;// 返回放大的視圖布局軸線
- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis;// 設(shè)置放大的視圖布局的軸線
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;// 返回縮小的視圖布局的軸線
- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis;// 設(shè)置縮小的視圖布局軸線
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;13、設(shè)備大小布局約束(iOS 6.0)
// 滿足約束視圖布局的大小
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;14、布局調(diào)度(iOS 6.0)
// 返回影響視圖布局限制的軸線
- (NSArray *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis;// 返回視圖布局約束是否影響指定視圖,主要用于調(diào)試約束布局,結(jié)合exerciseAmbiguityInLayout。
- (BOOL)hasAmbiguousLayout;// 隨機(jī)改變不同效值布局視圖,主要用于調(diào)試基于約束布局的視圖
- (void)exerciseAmbiguityInLayout;15、狀態(tài)恢復(fù)(iOS 6.0)
// 標(biāo)志是否支持保存,恢復(fù)視圖狀態(tài)信息
@property (nonatomic, copy) NSString *restorationIdentifier;// 保存視圖狀態(tài)相關(guān)信息
- (void) encodeRestorableStateWithCoder:(NSCoder *)coder;// 恢復(fù)和保存視圖相關(guān)信息
- (void) decodeRestorableStateWithCoder:(NSCoder *)coder;16、快照 (iOS7.0)
我們有時(shí)候可能需要取UIView對(duì)象的快照,有幾個(gè)原因,您可能希望從動(dòng)畫(huà)性能改進(jìn)上去分享您的應(yīng)用程序的屏幕截圖。現(xiàn)有的方法面臨幾個(gè)問(wèn)題:
1代碼不簡(jiǎn)單 2復(fù)雜的渲染選項(xiàng),比如層面罩的難再生 3OpenGL層需要特殊的事例代碼 4快照處理十分慢事實(shí)上,真的沒(méi)有任何通用的“快照”代碼可以應(yīng)付所有可能的場(chǎng)景。 但是IOS7將會(huì)改變,UIView和UIScreen會(huì)有一些新的方法,為各種用例提供簡(jiǎn)單的快照功能。
動(dòng)畫(huà)快照 我們可能經(jīng)常想對(duì)一個(gè)視圖進(jìn)行動(dòng)畫(huà)處理,但是視圖的動(dòng)畫(huà)太復(fù)雜,要么是動(dòng)畫(huà)太密集,要么就是需要額外的代碼來(lái)控制正確的行為。 例如附帶的項(xiàng)目,我們創(chuàng)建一個(gè)UIView的子類,它只是簡(jiǎn)單的添加一些子視圖,并旋轉(zhuǎn)來(lái)生成一個(gè)有趣的幾何排列。
// 調(diào)用snapshotViewAfterScreenUpdates:方法去創(chuàng)建復(fù)雜視圖的快照。方法返回一個(gè)UIView,來(lái)呈現(xiàn)被調(diào)用的視圖的界面。用這個(gè)方法去獲取視圖快照非常有效,比制作位圖要快的多。 當(dāng)獲得視圖快照后,我們把它添加到容器視圖上,并移除實(shí)際的復(fù)雜視圖。然后可以動(dòng)畫(huà)處理快照視圖了:
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates;- (UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets; - (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates;@property(nonatomic) BOOL?clearsContextBeforeDrawing??
//決定在視圖重畫(huà)之前是否先清理視圖以前的內(nèi)容,缺省值為YES
//如果你把這個(gè)屬性設(shè)為NO,那么你要保證能在 drawRect:方法中正確的繪畫(huà)。如果你的代碼
//已經(jīng)做了大量?jī)?yōu)化,那么設(shè)為NO可以提高性能,尤其是在滾動(dòng)時(shí)可能只需要重新繪畫(huà)視圖的一部分
@property(nonatomic) BOOL?clipsToBounds??
//決定子視圖是否被限定在當(dāng)前視圖的bounds中,缺省值為NO
@property(nonatomic) UIViewContentMode?contentMode
//決定當(dāng)視圖邊界變時(shí)呈現(xiàn)視圖內(nèi)容的方式
@property(nonatomic) CGFloat?contentScaleFactor
//應(yīng)用到當(dāng)前視圖的比例Scale
@property(nonatomic, getter=isExclusiveTouch) BOOL?exclusiveTouch
//決定當(dāng)前視圖是否是處理觸摸事件的唯一對(duì)象
@property(nonatomic, copy) NSArray *gestureRecognizers
//當(dāng)前視圖所附加的手勢(shì)識(shí)別器
@property(nonatomic, getter=isHidden) BOOL?hidden
//當(dāng)前視圖是否隱藏
@property(nonatomic, readonly, retain) CALayer *layer
//用于視圖渲染的核心動(dòng)畫(huà)層
@property(copy, nonatomic) NSArray *motionEffects
//當(dāng)前視圖的運(yùn)動(dòng)效果,IOS7才開(kāi)始擁有
@property(nonatomic, getter=isMultipleTouchEnabled) BOOL?multipleTouchEnabled
//當(dāng)前視圖是否接受多點(diǎn)觸控事件,缺省值為NO
@property(nonatomic, copy) NSString *restorationIdentifier
//該標(biāo)示符決定該視圖是否支持恢復(fù)狀態(tài),其實(shí)也只是個(gè)標(biāo)示符而已
//個(gè)人覺(jué)得就相當(dāng)于配置表視圖每個(gè)單元格時(shí)使用的標(biāo)示符一樣,可以直接在內(nèi)存中重用,提高了性能
//還有一點(diǎn)需注意,不應(yīng)該簡(jiǎn)單的定義這個(gè)標(biāo)示符,因?yàn)槠渌鶎俚膙iew controller ,還有view controller的
//所有 父view controllers都必須有一個(gè)恢復(fù)標(biāo)識(shí)符
@property(nonatomic, readonly, copy) NSArray *subviews??//當(dāng)前視圖的所有子視圖
@property(nonatomic, readonly) UIView *superview?//當(dāng)前視圖的父視圖
@property(nonatomic) NSInteger?tag??//當(dāng)前視圖的標(biāo)簽
@property(nonatomic) UIViewTintAdjustmentMode?tintAdjustmentMode
//色調(diào)調(diào)整模式,開(kāi)始用于IOS7
@property(nonatomic, retain) UIColor *tintColor
//色調(diào)顏色,開(kāi)始用于IOS7
@property(nonatomic) CGAffineTransform?transform??//視圖的仿射變換
@property(nonatomic, getter=isUserInteractionEnabled) BOOL?userInteractionEnabled
//決定與用戶交互事件是否從被忽略并從事件隊(duì)列中移除
? posted on 2015-08-19 11:14 城之內(nèi) 閱讀(...) 評(píng)論(...) 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/HypeCheng/p/4741685.html
總結(jié)
- 上一篇: Hibernate 一对一注释
- 下一篇: Linux命令 - 帮助命令 man