日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UIView详解

發(fā)布時(shí)間:2024/8/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIView详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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)畫類
  • 7、手勢類
  • 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è)是恒等變換,一般用來旋轉(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事件,具體的來說,就是當(dāng)設(shè)置了exclusiveTouch的 UIView是事件的第一響應(yīng)者,那么到你的所有手指離開前,其他的視圖UIview是不會(huì)響應(yīng)任何觸摸事件的,對(duì)于多點(diǎn)觸摸事件,這個(gè)屬性就非常重要,值得注意的是:手勢識(shí)別(GestureRecognizers)會(huì)忽略此屬性。

列舉用途:我們知道ios是沒有GridView視圖的,通常做法是在UITableView的cell上加載幾個(gè)子視圖,來模擬實(shí)現(xiàn) GridView視圖,但對(duì)于每一個(gè)子視圖來說,就需要使用exclusiveTouch,否則當(dāng)同時(shí)點(diǎn)擊多個(gè)子視圖,那么會(huì)觸發(fā)每個(gè)子視圖的事件。當(dāng)然 還有我們常說的模態(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í)行繪圖過程中會(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í)它又沒有完全填充它的邊界(bounds),或者它包含了整個(gè)或部分的透明的內(nèi)容視圖,那么將會(huì)導(dǎo)致未知的結(jié)果。 因此,如果視圖部分或全部支持透明,那么你必須把opaque這個(gè)值設(shè)置為NO.

?

CGRect?contentStretch 拉伸圖片屬性,已棄用。用?[UIImage resizableImageWithCapInsets:]代替。

?

?

?

3、幾何方法類

// hitTest主要用途是用來尋找那個(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無法調(diào)用父類的方法,這樣就沒法 使用PointInside:withEvent:進(jìn)行判斷,那么就沒法進(jìn)行子視圖的遍歷。當(dāng)去掉這個(gè)語句的時(shí)候,觸摸事件就不可能進(jìn)到子視圖中了,除非你在方法中直接返回子視圖的對(duì)象。這樣你在調(diào)試的過程中就會(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)是沒有做任何事情,子類可以重寫這個(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)行布局(如果沒有標(biāo)記,不會(huì)調(diào)用layoutSubviews)

- (void)layoutIfNeeded;

// 重新布局

- (void)layoutSubviews;

5、渲染類

// 重寫此方法,執(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)畫類

// 開始一個(gè)動(dòng)畫

+ (void)beginAnimations:(NSString *)animationID context:(void *)context;

// 執(zhí)行動(dòng)畫,類似數(shù)據(jù)庫的事務(wù)處理

+ (void)commitAnimations;

// 設(shè)置動(dòng)畫代理,默認(rèn)為nil

+ (void)setAnimationDelegate:(id)delegate;

// 當(dāng)動(dòng)畫執(zhí)行開始時(shí),執(zhí)行selector方法,默認(rèn)為NULL

+ (void)setAnimationWillStartSelector:(SEL)selector;

// 當(dāng)動(dòng)畫執(zhí)行結(jié)束時(shí),執(zhí)行selector方法

+ (void)setAnimationDidStopSelector:(SEL)selector;

// 設(shè)置動(dòng)畫時(shí)間,時(shí)間參數(shù)為double類型,默認(rèn)0.2

+ (void)setAnimationDuration:(NSTimeInterval)duration;

// 設(shè)置動(dòng)畫延遲時(shí)間

+ (void)setAnimationDelay:(NSTimeInterval)delay;

// 設(shè)置在動(dòng)畫塊內(nèi)部動(dòng)畫內(nèi)部動(dòng)畫屬性改變的開始時(shí)間

+ (void)setAnimationStartDate:(NSDate *)startDate;

// 設(shè)置動(dòng)畫的旋轉(zhuǎn)曲度變化,默認(rèn)為UIViewAnimationCurveEaseInOut.值定義在UIViewAnimationCurve結(jié)構(gòu)體中。

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { //動(dòng)畫曲線// 緩慢開始,中間加速,然后減速到結(jié)束UIViewAnimationCurveEaseInOut, // 緩慢開始,加速到結(jié)束 UIViewAnimationCurveEaseIn, // 加速開始,加速到結(jié)束 UIViewAnimationCurveEaseOut, //正常速度 UIViewAnimationCurveLinear }; + (void)setAnimationCurve:(UIViewAnimationCurve)curve;

// 設(shè)置動(dòng)畫在動(dòng)畫模塊中的重復(fù)次數(shù)

+ (void)setAnimationRepeatCount:(float)repeatCount;

// 設(shè)置動(dòng)畫塊中的動(dòng)畫效果是否自動(dòng)重復(fù)播放

+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses;

// 設(shè)置動(dòng)畫是否從當(dāng)前狀態(tài)開始播放,默認(rèn)為NO.

+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState;

// 在動(dòng)畫設(shè)置過渡效果

+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;

transition把一個(gè)過渡效果應(yīng)用到視圖中。值定義在UIViewAnimationTransition結(jié)構(gòu)體中。

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {UIViewAnimationTransitionNone, 沒有過渡UIViewAnimationTransitionFlipFromLeft, 翻轉(zhuǎn)視圖從左到右UIViewAnimationTransitionFlipFromRight, 翻轉(zhuǎn)視圖從右到左UIViewAnimationTransitionCurlUp, 從上卷動(dòng)UIViewAnimationTransitionCurlDown, 從下卷動(dòng) };

view:需要過渡的視圖對(duì)象。

cache:如果是YES,那么在開始和結(jié)束圖片視圖渲染一次并在動(dòng)畫中創(chuàng)建幀;否則,視圖將會(huì)在每一幀都渲染。例如緩存,你不需要在視圖轉(zhuǎn)變中不停的更新,你只需要等到轉(zhuǎn)換完成再去更新視圖。

1、開始一個(gè)動(dòng)畫塊。 2、在容器視圖中設(shè)置轉(zhuǎn)換。 3、在容器視圖中移除子視圖。 4、在容器視圖中添加子視圖。 5、結(jié)束動(dòng)畫塊。

// 設(shè)置是否開啟動(dòng)畫,默認(rèn)YES,開啟

+ (void)setAnimationsEnabled:(BOOL)enabled;

// 驗(yàn)證動(dòng)畫是否開啟,YES開啟,NO關(guān)閉

+ (BOOL)areAnimationsEnabled;

// iOS7之后替代 setAnimationsEnabled

+ (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation;

// iOS4.0之后,動(dòng)畫效果處理塊

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

(NSTimeInterval)duration :動(dòng)畫時(shí)間

(NSTimeInterval)delay:延遲時(shí)間

(UIViewAnimationOptions)options 動(dòng)畫參數(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)畫效果塊

可以設(shè)置屬性如下:frame\bounds\center\transform\alpha\backgroundColor\contentStretch

completion:(void (^)(BOOL finished))completion 動(dòng)畫結(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)畫效果處理(無延遲,無參數(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)畫效果處理簡單版 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);// 過渡動(dòng)畫效果塊,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];}];// 視圖之間切換的過渡動(dòng)畫效果塊,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í)別器(iOS3.2)

NSArray *gestureRecognizers;UIKit 中UIGestureRecognizer類的子類系列如下: UITapGestureRecognizer – “輕擊”手勢。可以配置為“單擊”和“連擊”的識(shí)別。 UIPinchGestureRecognizer –“捏合”手勢。該手勢通常用于縮放視圖或改變可視組件的大小。 UIPanGestureRecognizer – “平移”手勢。識(shí)別拖拽或移動(dòng)動(dòng)作。 UISwipeGestureRecognizer – “輕掃”手勢。當(dāng)用戶從屏幕上劃過時(shí)識(shí)別為該手勢。可以指定該動(dòng)作的方向(上、下、左、右)。 UIRotationGestureRecognizer – “轉(zhuǎn)動(dòng)”手勢。用戶兩指在屏幕上做相對(duì)環(huán)形運(yùn)動(dòng)。 UILongPressGestureRecognizer – “長按”手勢。使用1指或多指觸摸屏幕并保持一定時(shí)間。

// 綁定手勢到視圖(iOS3.2)

- (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;

//從視圖中移除手勢 (iOS3.2)

- (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;

//手勢識(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)畫性能改進(jìn)上去分享您的應(yīng)用程序的屏幕截圖。現(xiàn)有的方法面臨幾個(gè)問題:

1代碼不簡單 2復(fù)雜的渲染選項(xiàng),比如層面罩的難再生 3OpenGL層需要特殊的事例代碼 4快照處理十分慢

事實(shí)上,真的沒有任何通用的“快照”代碼可以應(yīng)付所有可能的場景。 但是IOS7將會(huì)改變,UIView和UIScreen會(huì)有一些新的方法,為各種用例提供簡單的快照功能。

動(dòng)畫快照 我們可能經(jīng)常想對(duì)一個(gè)視圖進(jìn)行動(dòng)畫處理,但是視圖的動(dòng)畫太復(fù)雜,要么是動(dòng)畫太密集,要么就是需要額外的代碼來控制正確的行為。 例如附帶的項(xiàng)目,我們創(chuàng)建一個(gè)UIView的子類,它只是簡單的添加一些子視圖,并旋轉(zhuǎn)來生成一個(gè)有趣的幾何排列。

// 調(diào)用snapshotViewAfterScreenUpdates:方法去創(chuàng)建復(fù)雜視圖的快照。方法返回一個(gè)UIView,來呈現(xiàn)被調(diào)用的視圖的界面。用這個(gè)方法去獲取視圖快照非常有效,比制作位圖要快的多。 當(dāng)獲得視圖快照后,我們把它添加到容器視圖上,并移除實(shí)際的復(fù)雜視圖。然后可以動(dòng)畫處理快照視圖了:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates;- (UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets; - (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates; 2

@property(nonatomic) BOOL?clearsContextBeforeDrawing??
//決定在視圖重畫之前是否先清理視圖以前的內(nèi)容,缺省值為YES
//如果你把這個(gè)屬性設(shè)為NO,那么你要保證能在 drawRect:方法中正確的繪畫。如果你的代碼
//已經(jīng)做了大量優(yōu)化,那么設(shè)為NO可以提高性能,尤其是在滾動(dòng)時(shí)可能只需要重新繪畫視圖的一部分

@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í)別器

@property(nonatomic, getter=isHidden) BOOL?hidden
//當(dāng)前視圖是否隱藏

@property(nonatomic, readonly, retain) CALayer *layer
//用于視圖渲染的核心動(dòng)畫層

@property(copy, nonatomic) NSArray *motionEffects
//當(dāng)前視圖的運(yùn)動(dòng)效果,IOS7才開始擁有

@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è)人覺得就相當(dāng)于配置表視圖每個(gè)單元格時(shí)使用的標(biāo)示符一樣,可以直接在內(nèi)存中重用,提高了性能
//還有一點(diǎn)需注意,不應(yīng)該簡單的定義這個(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)整模式,開始用于IOS7
@property(nonatomic, retain) UIColor *tintColor
//色調(diào)顏色,開始用于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é)

以上是生活随笔為你收集整理的UIView详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。