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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UIView详解

發布時間:2024/8/26 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIView详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
UIView詳解 ?

UIView詳解(http://www.beyondabel.com/blog/2014/01/01/uiview/)

引言

UIView表示屏幕上的一塊矩形區域,它在App中占有絕對重要的地位,因為iOS中幾乎所有可視化控件都是UIView的子類。負責渲染區域的內容,并且響應該區域內發生的觸摸事件

目錄

  • 1、UIView家族
  • 2、UIView的基本屬性
  • 3、幾何方法類
  • 4、控制級別類
  • 5、渲染類
  • 6、動畫類
  • 7、手勢類
  • 8、移動效果類
  • 9、基于布局約束類(iOS6.0)
  • 10、基于布局的約束core方法(iOS 6.0)
  • 11、基于約束的兼容性(iOS 6.0)
  • 12、層次布局的約束(iOS 6.0)
  • 13、設備大小布局約束(iOS 6.0)
  • 14、布局調度(iOS 6.0)
  • 15、狀態恢復(iOS 6.0)
  • 16、快照 (iOS7.0)

1、UIView家族

下圖就是視圖的內層次

2、UIView的基本屬性

// UIView是否接受events事件,默認為YES

BOOL userInteractionEnabled;

// 用于做標識所用,默認為0

NSInteger tag;

// Core Animation layer有關,在常用方法中再詳細講解

CALayer *layer;

// UIView在父視圖中的位置 如果是在變形的時候不要用frame,使用bounds和center屬性

CGRect frame;

// UIView相對自己的位置 bounds的原點就是子視圖的原點

CGRect bounds;

// UIView的中心點. animatable

CGPoint center;

// 線性代數里面講的矩陣變換,這個是恒等變換,一般用來旋轉,縮放

CGAffineTransform transform;

// 修改contentScaleFactor可以讓UIView的渲染精度提高,這樣即使在CGAffineTransform放大之后仍然能保持銳利。

CGFloat contentScaleFactor;

// 是否允許多點觸摸

BOOL multipleTouchEnabled;

// default is NO?決定當前視圖是否是處理觸摸事件的唯一對象

BOOL exclusiveTouch;

UIView 的exclusiveTouch屬性

exclusiveTouch的意思是UIView會獨占整個Touch事件,具體的來說,就是當設置了exclusiveTouch的 UIView是事件的第一響應者,那么到你的所有手指離開前,其他的視圖UIview是不會響應任何觸摸事件的,對于多點觸摸事件,這個屬性就非常重要,值得注意的是:手勢識別(GestureRecognizers)會忽略此屬性。

列舉用途:我們知道ios是沒有GridView視圖的,通常做法是在UITableView的cell上加載幾個子視圖,來模擬實現 GridView視圖,但對于每一個子視圖來說,就需要使用exclusiveTouch,否則當同時點擊多個子視圖,那么會觸發每個子視圖的事件。當然 還有我們常說的模態對話框。

// UIView的背影顏色

UIColor backgroundColor;

// UIView是否隱藏

BOOL hidden;

// 為0時完全透明,為1時完全不透明。

CGFloat alpha;

//在類的層次結構中,如果clipsTobounds設為YES,超出superView的部分subview就不會顯示,否則會做顯示, 默認情況下是NO。

BOOL clipsToBounds;

//這是一個優化屬性,如果該值為YES, 那么繪圖在繪制該視圖的時候把整個視圖當作不透明對待。這樣,繪圖系統在執行繪圖過程中會優化一些操作并提升系統性能;如果是設置為NO, 繪圖系統將其和其他內容平等對待,不去做優化操作。為了性能方面的考量,默認被置為YES(意味著‘優化’)。

BOOL opaque; UIView *superview;// 父視圖 NSArray *subviews;// 子視圖

注:frame和center都是相對于父視圖的,bounds是相對于自身的。當view完全透明和隱藏時不能響應事件。

opaque和alpha 是有關系的。 一個不透明視圖需要整個邊界里面的內容都是不透明的。基于這個原因,opaque設置為YES,要求對應的alpha必須為1.0。如果一個UIView實例opaque被設置為YES, 而同時它又沒有完全填充它的邊界(bounds),或者它包含了整個或部分的透明的內容視圖,那么將會導致未知的結果。 因此,如果視圖部分或全部支持透明,那么你必須把opaque這個值設置為NO.

?

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

?

?

?

3、幾何方法類

// hitTest主要用途是用來尋找那個視圖是被觸摸了

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

// 如果我們不想讓某個視圖響應事件,讓此方法返回NO就行了。默認為YES

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

舉個例子,建立一個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中增加一個子視圖TestSecondView也重載這兩個方法

- (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無法調用父類的方法,這樣就沒法 使用PointInside:withEvent:進行判斷,那么就沒法進行子視圖的遍歷。當去掉這個語句的時候,觸摸事件就不可能進到子視圖中了,除非你在方法中直接返回子視圖的對象。這樣你在調試的過程中就會發現,每次你點擊一個view都會先進入到這個view的父視圖中的hitTest方法,然后 調用super的hitTest方法之后就會查找pointInside是否返回YES如果是,則就把消息傳遞個子視圖處理,子視圖用同樣的方法遞歸查找 自己的子視圖。所以從這里調試分析看,hitTest方法這種遞歸調用的方式就一目了然了。

// 將像素point由point所在視圖轉換到目標視圖view中,返回在目標視圖view中的像素值

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;

// 將像素point從view中轉換到當前視圖中,返回在當前視圖中的像素值

- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;

// 將rect由rect所在視圖轉換到目標視圖view中,返回在目標視圖view中的rect

- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;

// 將rect從view中轉換到當前視圖中,返回在當前視圖中的rect

- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;

4、控制級別類

// 把視圖從父類移除 - (void)removeFromSuperview; // 添加子視圖到某個位置 - (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:的區別:

[view addSubView:oneView] == [view insertSubview:oneView atIndex:view.subviews.cout];

// 將view顯示在最前面(要將一個view顯示在最前面,只要調用其父視圖的bringSubviewToFront:方法)

- (void)bringSubviewToFront:(UIView *)view;

// 將view推送到背后

- (void)sendSubviewToBack:(UIView *)view;

// 這個函數默認是沒有做任何事情,子類可以重寫這個函數, 當加入視圖完成后可以附加一些操作

- (void)didAddSubview:(UIView *)subview;

// 將移除子視圖會調用

- (void)willRemoveSubview:(UIView *)subview;

// 通知即將移動到新的父視圖中

- (void)willMoveToSuperview:(UIView *)newSuperview;

// 通知已經到新父視圖

- (void)didMoveToSuperview;

// 通知即將已移動到新的窗口

- (void)willMoveToWindow:(UIWindow *)newWindow;

// 通知已經移動新的窗口

- (void)didMoveToWindow;


當您為某個視圖添加子視圖時,UIKit 會向相應的父子視圖發送幾個消息,通知它們當前發生的狀態變化。您可以在自己的定制視圖中對諸如?willMoveToSuperview: 、
willMoveToWindow: 、?willRemoveSubview: 、?didAddSubview: 、?didMoveToSuperview?、和?didMoveToWindow這樣的方法進行重載,以便在事件發生的前后進行必要的處理,并根據發生的變化更新視圖的狀態信息。

// 判斷一個視圖是否在父視圖層中

- (BOOL)isDescendantOfView:(UIView *)view;

// 獲取標記的子視圖

- (UIView *)viewWithTag:(NSInteger)tag;

// 標記為需要重新布局,異步調用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定會被調用

- (void)setNeedsLayout;

// 如果有需要刷新的標記,立即調用layoutSubviews進行布局(如果沒有標記,不會調用layoutSubviews)

- (void)layoutIfNeeded;

// 重新布局

- (void)layoutSubviews;

5、渲染類

// 重寫此方法,執行重繪

- (void)drawRect:(CGRect)rect;

// 標記為需要重繪,異步調用drawRect

- (void)setNeedsDisplay;

// 標記為需要局部重繪

- (void)setNeedsDisplayInRect:(CGRect)rect;

注:drawRect是對receiver的重繪。setNeedDisplay在receiver標上一個需要被重新繪圖的標記,在下一個draw周期自動重繪,iphone device的刷新頻率是60hz,也就是1/60秒后重繪

6、動畫類

// 開始一個動畫

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

// 執行動畫,類似數據庫的事務處理

+ (void)commitAnimations;

// 設置動畫代理,默認為nil

+ (void)setAnimationDelegate:(id)delegate;

// 當動畫執行開始時,執行selector方法,默認為NULL

+ (void)setAnimationWillStartSelector:(SEL)selector;

// 當動畫執行結束時,執行selector方法

+ (void)setAnimationDidStopSelector:(SEL)selector;

// 設置動畫時間,時間參數為double類型,默認0.2

+ (void)setAnimationDuration:(NSTimeInterval)duration;

// 設置動畫延遲時間

+ (void)setAnimationDelay:(NSTimeInterval)delay;

// 設置在動畫塊內部動畫內部動畫屬性改變的開始時間

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

// 設置動畫的旋轉曲度變化,默認為UIViewAnimationCurveEaseInOut.值定義在UIViewAnimationCurve結構體中。

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

// 設置動畫在動畫模塊中的重復次數

+ (void)setAnimationRepeatCount:(float)repeatCount;

// 設置動畫塊中的動畫效果是否自動重復播放

+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses;

// 設置動畫是否從當前狀態開始播放,默認為NO.

+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState;

// 在動畫設置過渡效果

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

transition把一個過渡效果應用到視圖中。值定義在UIViewAnimationTransition結構體中。

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

view:需要過渡的視圖對象。

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

1、開始一個動畫塊。 2、在容器視圖中設置轉換。 3、在容器視圖中移除子視圖。 4、在容器視圖中添加子視圖。 5、結束動畫塊。

// 設置是否開啟動畫,默認YES,開啟

+ (void)setAnimationsEnabled:(BOOL)enabled;

// 驗證動畫是否開啟,YES開啟,NO關閉

+ (BOOL)areAnimationsEnabled;

// iOS7之后替代 setAnimationsEnabled

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

// iOS4.0之后,動畫效果處理塊

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

(NSTimeInterval)duration :動畫時間

(NSTimeInterval)delay:延遲時間

(UIViewAnimationOptions)options 動畫參數

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 :動畫效果塊

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

completion:(void (^)(BOOL finished))completion 動畫結束塊

例:

[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);}];}];// 動畫效果處理(無延遲,無參數)iOS4.0之后,默認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); }];//動畫效果處理簡單版 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);// 過渡動畫效果塊,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];}];// 視圖之間切換的過渡動畫效果塊,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、手勢類

// 手勢識別器(iOS3.2)

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

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

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

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

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

//手勢識別處理方式在gesture recognizer視圖轉出《UIGestureRecognizerStatePossible》狀態時調用,如果返回NO,則轉換到《UIGestureRecognizerStateFailed》;如果返回YES,則繼續識別觸摸序列.(默認情況下為YES)。(iOS6.0)

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
8、移動效果類(iOS7.0)
- (void)addMotionEffect:(UIMotionEffect *)effect; - (void)removeMotionEffect:(UIMotionEffect *)effect;

9、基于布局約束類(iOS6.0)

// 視圖布局約束

- (NSArray *)constraints;

// 視圖布局上添加一個約束

- (void)addConstraint:(NSLayoutConstraint *)constraint;

// 視圖布局上添加多個約束

- (void)addConstraints:(NSArray *)constraints;

// 移除視力布局上的一個約束

- (void)removeConstraint:(NSLayoutConstraint *)constraint;

// 移除視圖布局上的多個約束

- (void)removeConstraints:(NSArray *)constraints;

10、基于布局的約束core方法(iOS 6.0)

// 調用新的視圖布局自動觸發,更新視圖布局上的約束

- (void)updateConstraintsIfNeeded;

// 更新自定義視圖布局約束

- (void)updateConstraints;

// 判斷視圖布局是否需要更新約束

- (BOOL)needsUpdateConstraints;

// 設置視圖布局是否需要更新約束

- (void)setNeedsUpdateConstraints;

11、基于約束的兼容性(iOS 6.0)

// 標示是否自動遵循視圖布局約束,默認為YES

- (BOOL)translatesAutoresizingMaskIntoConstraints;

// 設置是否自動遵循視圖布局約束

- (void)setTranslatesAutoresizingMaskIntoConstraints:(BOOL)flag;

// 返回是遵循自定義視圖布局約束

+ (BOOL)requiresConstraintBasedLayout NS_AVAILABLE_IOS(6_0);

12、層次布局的約束(iOS 6.0)

// 返回矩形對于指定視圖框架

- (CGRect)alignmentRectForFrame:(CGRect)frame;

// 返回框架對于指定視圖矩形

- (CGRect)frameForAlignmentRect:(CGRect)alignmentRect;

// 返回自定義視圖大小

- (UIEdgeInsets)alignmentRectInsets;

// 如果超出約束范圍,自動生成基線限制,以滿足視圖需求

- (UIView *)viewForBaselineLayout;

// 返回放大的視圖布局軸線

- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis;

// 設置放大的視圖布局的軸線

- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;

// 返回縮小的視圖布局的軸線

- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis;

// 設置縮小的視圖布局軸線

- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;

13、設備大小布局約束(iOS 6.0)

// 滿足約束視圖布局的大小

- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;

14、布局調度(iOS 6.0)

// 返回影響視圖布局限制的軸線

- (NSArray *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis;

// 返回視圖布局約束是否影響指定視圖,主要用于調試約束布局,結合exerciseAmbiguityInLayout。

- (BOOL)hasAmbiguousLayout;

// 隨機改變不同效值布局視圖,主要用于調試基于約束布局的視圖

- (void)exerciseAmbiguityInLayout;

15、狀態恢復(iOS 6.0)

// 標志是否支持保存,恢復視圖狀態信息

@property (nonatomic, copy) NSString *restorationIdentifier;

// 保存視圖狀態相關信息

- (void) encodeRestorableStateWithCoder:(NSCoder *)coder;

// 恢復和保存視圖相關信息

- (void) decodeRestorableStateWithCoder:(NSCoder *)coder;

16、快照 (iOS7.0)

我們有時候可能需要取UIView對象的快照,有幾個原因,您可能希望從動畫性能改進上去分享您的應用程序的屏幕截圖。現有的方法面臨幾個問題:

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

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

動畫快照 我們可能經常想對一個視圖進行動畫處理,但是視圖的動畫太復雜,要么是動畫太密集,要么就是需要額外的代碼來控制正確的行為。 例如附帶的項目,我們創建一個UIView的子類,它只是簡單的添加一些子視圖,并旋轉來生成一個有趣的幾何排列。

// 調用snapshotViewAfterScreenUpdates:方法去創建復雜視圖的快照。方法返回一個UIView,來呈現被調用的視圖的界面。用這個方法去獲取視圖快照非常有效,比制作位圖要快的多。 當獲得視圖快照后,我們把它添加到容器視圖上,并移除實際的復雜視圖。然后可以動畫處理快照視圖了:

- (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??
//決定在視圖重畫之前是否先清理視圖以前的內容,缺省值為YES
//如果你把這個屬性設為NO,那么你要保證能在 drawRect:方法中正確的繪畫。如果你的代碼
//已經做了大量優化,那么設為NO可以提高性能,尤其是在滾動時可能只需要重新繪畫視圖的一部分

@property(nonatomic) BOOL?clipsToBounds??
//決定子視圖是否被限定在當前視圖的bounds中,缺省值為NO

@property(nonatomic) UIViewContentMode?contentMode
//決定當視圖邊界變時呈現視圖內容的方式

@property(nonatomic) CGFloat?contentScaleFactor
//應用到當前視圖的比例Scale

@property(nonatomic, getter=isExclusiveTouch) BOOL?exclusiveTouch
//決定當前視圖是否是處理觸摸事件的唯一對象

@property(nonatomic, copy) NSArray *gestureRecognizers
//當前視圖所附加的手勢識別器

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

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

@property(copy, nonatomic) NSArray *motionEffects
//當前視圖的運動效果,IOS7才開始擁有

@property(nonatomic, getter=isMultipleTouchEnabled) BOOL?multipleTouchEnabled
//當前視圖是否接受多點觸控事件,缺省值為NO

@property(nonatomic, copy) NSString *restorationIdentifier
//該標示符決定該視圖是否支持恢復狀態,其實也只是個標示符而已
//個人覺得就相當于配置表視圖每個單元格時使用的標示符一樣,可以直接在內存中重用,提高了性能
//還有一點需注意,不應該簡單的定義這個標示符,因為其所屬的view controller ,還有view controller的
//所有 父view controllers都必須有一個恢復標識符

@property(nonatomic, readonly, copy) NSArray *subviews??//當前視圖的所有子視圖
@property(nonatomic, readonly) UIView *superview?//當前視圖的父視圖

@property(nonatomic) NSInteger?tag??//當前視圖的標簽

@property(nonatomic) UIViewTintAdjustmentMode?tintAdjustmentMode
//色調調整模式,開始用于IOS7
@property(nonatomic, retain) UIColor *tintColor
//色調顏色,開始用于IOS7

@property(nonatomic) CGAffineTransform?transform??//視圖的仿射變換

@property(nonatomic, getter=isUserInteractionEnabled) BOOL?userInteractionEnabled
//決定與用戶交互事件是否從被忽略并從事件隊列中移除

? posted on 2015-08-19 11:14 城之內 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/HypeCheng/p/4741685.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。