|Creating and Configuring View Objects
|Creating and Managing a View Hierarchy
|Adjusting the Size and Position of Views at Runtime
|Animating PRoperty Changes in a View
|Creating Animated Transitions Between Views
用Interface Builder就是大家熟知的用StoryBoard進行頁面的創建,這里就不多講了。主要是用StoryBoard進行UI的實現還是用Programatic的方法好呢,需要以后的繼續研究。
默認的View的初始化函數是initWithFrame: ,它將設備View相對于Superview的坐標和大小,如下:
CGRect viewRect = CGRectMake(0, 0, 100, 100);UIView* myView = [[UIView alloc] initWithFrame:viewRect];
這樣就創建了一個有坐標和大小的View.
UIView提供了很多屬性提供給使用者使用,可以通過修改這些屬性達到想要的效果。




這些屬性不一定都會用,但是要了解,至少知道有個這樣的東西存在,這樣就方便以后使用了。
UIView有一個tag屬性,通過這個屬性,我們就可以用UIView的viewWithTag: 獲取所對應的View。注意這個函數是通過深度優先去遍歷的
這一部分主要是就介紹了View Hierarchy的創建和管理,也就是對View這個對象進行管理。
2.當Subview超出Superview的bonds的范圍時,在默認的情況先,多出的部分會被顯示,如果想讓多的部分被切掉可以設置View的ClipsToBonds = YES。
3.addSubview在下面兩個地方使用比較普遍
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ // Override point for customization after application launch. // Add the view controller's view to the window and display. [window addSubview:viewController.view]; [window makeKeyAndVisible];return YES; }
1.可以用如下方法hide a view
2.在View被隱藏后,它將不會顯示。但是會參與到界面的auto-layout過程中。所以當一個界面現在小時等會又要出現的情況下,hidden比remove 一個View要更有效率
3.關于hidden view的responds to Events
當一個View被隱藏,它將無法Respond to the events!
但是!如果這個將要本隱藏的View是現在的First Responder,那么在他隱藏的時候,不會將Fisrt Responder這個狀態注銷掉,所以需要強制的改變這個狀態才行。
4.關于hidden的動畫
很多人需要View在hidden時加入動畫,這里要注意的是,用hidden屬性的話將不會現實動畫,只有用alpha屬性進行hidden才可以加入想要的動畫。
有兩種方式可以在View Hierarchy中得到想要的View
這里主要講的是View的變化,比如放大縮小,旋轉等該怎么實現
1、UIView的transform屬性包含了一個CGAffineTransform 的結構,在默認的情況下這個屬性是不會對View產生任何影響,
但我們可以在任何時候對這個transform屬性進行賦值操作,使View的狀態發生改變。
比如,讓View旋轉45度:
// M_PI/4.0 is one quarter of a half circle, or 45 degrees.CGAffineTransform xform = CGAffineTransformMakeRotation(M_PI/4.0);self.view.transform = xform;
2、transform的操作都是以View的center ponit為原點進行操作的
3、scaling a view只是改變圖片的長寬,而不改變其center point
這里主要將的是 在ViewHierarchy中各View之間的其不同坐標參照系下的坐標轉換。
1、對于UIView我們可以用下面兩組函數進行轉換
下圖將會對這個轉換過程和結果進行很好的詮釋:

這里的藍色和粉色虛線框代表兩個不同的View(藍色的為A View、粉色的為B View),我們將需要轉化的矩形稱作M矩形
此時可以看到,M矩形在A View中的位置是藍色實線的矩形,而通過轉換M矩形在B View中變成了粉色實線的矩形。相當于一個投影,他們有自己獨立的參照系。
在程序的運行過程中,一個View的大小和位置可能發生變化,則他的subviews的大小和位置也應該會發生相應的變化。
當以下的事件發生時,就會觸發Layout發生改變:
關于這個Autoresing Rules主要分為兩個部分:View的屬性和它的subView的屬性設定。
1、View的屬性
當一個View的Layout發生改變時,需要不要其subView也跟著改變取決于他的autoresizesSubviews這個屬性值,如果它為YES,則subviews的layout會autoresizing,反之亦然。
2、subview的屬性
當superview允許autoresizing后,我該怎么resizing呢?這個時候就要看我設置了那些resizing的屬性,總共有以下七種:

不難看到,可以將其分為三大類:長和寬、左右邊距、上下邊距。
當某個Autoresizing mask constant被設置后,其所對應的屬性將會autoresizing,如果沒有被設置,其對應的屬性值將是固定的。
現在設定autoresizing rule最方便的方法是在IB中的inspector頁面中設置,但值得注意的是:
Important: Ifaview’stransformpropertydoesnotcontaintheidentitytransform,theframeofthatview is undefined and so are the results of its autoresizing behaviors.
這個Important不是很懂。。。
當一個View在autoresing之后,如果他的Layout還達不到你的要求,則可以調用View的layoutSubviews函數,來調整你的subviews。
在 layoutSubviews函數中可以完成以下幾件事情
文檔中所提到的下面這段話,蠻有意思的,我覺得像淘寶這樣的app是不是就這個思想

每一個View對象都會有一個Core Animation Layer去控制他的動畫,而這個layer存放在View對象的layer屬性中。
通過實現layerClass函數來確定View的layer的類型,如下:

這個就是再View類中重載了這個函數,并返回了想要的Layer的類型,值得注意的是,當View創建完成后,它的Layer的類型是不能改變的。
View中的Layer并不只是再創建的時候所生成的那一個,為我們可以新建一個Layer嵌入到View中,可以讓我們對Layer直接進行操作,而不是對View。這個新加入的Layer是無法進入Responder
chains的,但他可以完成一系列的動畫操作。
這里將介紹創建一個Custom View需要做的一系列操作:
1、實現一個適合的初始化函數
2、實現dealloc函數對聲明的數據進行處理
3、通過drawRect:實現所有的自定義畫圖
4、設置View的autoresizing屬性,來設定autoresizing behavior
5、如果你的view中還有Subviews,則需要完成以下操作:
6、為了獲取基本的點擊事件,需要完成以下操作:
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
注意:touchesCancelled:withEvent: 應該每次都實現,這樣就可以在結束時間監聽的時候忽略其他時間的響應函數。
7、自定義圖像的Print,實現drawRect:forViewPrintFormatter:


當對一個View進行自定義繪制的時候,需要重載他的drawRect:函數,并在這個函數里面實現繪制的代碼。但是需要注意,用drawRect:是最后的大招,如果能用別的方法來展示你的內容更好。
在drawRect:函數中,只能做有關繪圖的操作,不要加入與繪圖無關的操作,而且要求繪制的代碼要盡可能高效。
在drawRect:中,UIKit已經將繪制環境配置好了,所以只用通過UIGraphicsGetCurrentContext 函數來獲取當前圖像的上下文,以下是一個簡單的drawRect:實現
OC:

Swift:

這段代碼就是在view的(5,5)位置畫一個線的粗度為10的矩形框,顏色為藍色、紅色。
1、View是可以回饋事件的,如果對時間不感興趣,可以將其忽略或者傳遞給Chains的上一級
2、View不止可以識別touch Event,還能加入更多,可用addGestureRecognizer:函數天劍
3、View默認情況下是支持單指點擊,通過設置multipleTouchEnabled=YES來支持多點操作
4、當View不需要相應Event時,可以設置userInteractionEnabeld屬性
5、對于整個Application可以通過beginIgnoringInteractionEvents 和 endIgnoringInteractionEvents來開啟和關閉App對事件的相應。
通過dealloc方法,來release在drawRect:中所產生的資源
主要介紹了Apple提供的動畫該如何去實現。
UIKit和Core Animation都支持動畫,但他們兩個所支持的水平是不同的。
在UIKit中,動畫是通過UIView對象來執行的,UIView只能完成一個常見的基本動畫,下表也出來UIVIew動畫所對應的屬性


針對Layer使用Core Animation可以完成一些View所不能完成的動畫,比如下面的動畫:

為了動態的顯示UIView屬性的變化過程,必須將代碼寫進一個動畫塊中(Animation Block)
以下這三個函數,可以設置不同定制級別的動畫

因為這些Block函數都是類函數,所以不會與單個View進行綁定,從而可以創建一個animation函數去控制多個View。
下面的代碼是一個View淡出,一個View淡入,這個Animation Block在執行時會開啟一個新的線程,所以不會阻塞所在的線程和主線程,代碼如下:
OC:


Swift:

上面的Animation Block只能完成ease-in、ease-out動畫,如果想要更多的效果需要調用
animateWithDuration:delay:options:animations:completion: 函數去自定義你的動畫,通過這個可以你讓你達到如下的效果:
例子代碼如下:
OC:


Swift:

動畫中的動畫,代碼例子:
OC:


Swift:

在View之間進行切換,可以有兩種方式的動畫去完成
對一個View中的subViews進行添加或刪除的操作。可用函數
transitionWithView:duration:options:animations:completion:
下面的例子就是實現了整個頁面的翻轉,如翻書一樣。但是只是更新了局部的內容,代碼如下:
OC:

Swift:

如果想View界面發生巨大的變化,就需要替換整個View界面,而不是更改View界面中局部的Subviews。這里的替換只是對View的替換,ViewController并沒有發生改變。
所用到的函數:transitionFromView:toView:duration:options:completion:
該函數的功能是從View Hierarchy中移除第一個View,再插入第二個View。若不想移除View,可以用UIViewAnimationOptionShowHiddeTransitonViews參數讓View只是隱藏。
下列代碼實現了兩個View的錢換,但他們都受到一個ViewController的控制。所以兩個View的內容是相同的,但是表現形式是不一樣的。
OC:

Swift:
持續更新中。。。。
原創文章,轉載請標明出處,謝謝!
http://m.survivalescaperooms.com/scaptain/p/3981612.html
新聞熱點
疑難解答