国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

UIViewProgrammingGuide學習筆記

2019-11-14 20:02:36
字體:
來源:轉載
供稿:網友

|View

    |Creating and Configuring View Objects

    |Creating and Managing a View Hierarchy

    |Adjusting the Size and Position of Views at Runtime

    |Defining a Custom View

|Animation

    |What Can Be Animated?

    |Animating PRoperty Changes in a View

    |Creating Animated Transitions Between Views

View

Creating and Configuring View Objects 

Creating View Objects Using Interface Builder 

  用Interface Builder就是大家熟知的用StoryBoard進行頁面的創建,這里就不多講了。主要是用StoryBoard進行UI的實現還是用Programatic的方法好呢,需要以后的繼續研究。

Creating View Objects Programmatically 

  默認的View的初始化函數是initWithFrame:  ,它將設備View相對于Superview的坐標和大小,如下:

CGRect  viewRect = CGRectMake(0, 0, 100, 100);UIView* myView = [[UIView alloc] initWithFrame:viewRect];

這樣就創建了一個有坐標和大小的View.

Setting the Properties of a View 

UIView提供了很多屬性提供給使用者使用,可以通過修改這些屬性達到想要的效果。

這些屬性不一定都會用,但是要了解,至少知道有個這樣的東西存在,這樣就方便以后使用了。

Tagging Views for Future Identification 

UIView有一個tag屬性,通過這個屬性,我們就可以用UIView的viewWithTag:  獲取所對應的View。注意這個函數是通過深度優先去遍歷的

 



 

Creating and Managing a View Hierarchy 

  這一部分主要是就介紹了View Hierarchy的創建和管理,也就是對View這個對象進行管理。

Adding and Removing Subviews 

  1. 通過以下函數可以對Subviews進行添加、刪除、重排序
  • addSubview:
  • insertSubview:
  • 重排序:
    • bringSubviewToFront:
    • sendSubviewToBack:
    • exchangeSubviewAtIndex:withSubviewAtIndex
  • removeFromSuperview:  

  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; }

 

  • 在loadView或者viewDidLoad函數中,對View hierarchy進行管理
    • loadView---------building your View programmatically
    • viewDidLoad-----creat view programmatically or load them from NIB

Hiding Views 

  1.可以用如下方法hide a view

  •   hidden = YES
  •   alpha = 0.0

  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才可以加入想要的動畫。

Locating Views in a View Hierarchy 

有兩種方式可以在View Hierarchy中得到想要的View

  • 將View的指針引用保存下來,下次直接使用
  • 通過View的tag屬性,用viewWithTag:來Get這個View

Translating, Scaling, and Rotating Views 

這里主要講的是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

Converting Coordinates in the View Hierarchy 

這里主要將的是 在ViewHierarchy中各View之間的其不同坐標參照系下的坐標轉換。

  1、對于UIView我們可以用下面兩組函數進行轉換

  • convertPoint:fromView: / convertPoint:toView:
  • convertRect:fromView: / convertRect:toView:

 

下圖將會對這個轉換過程和結果進行很好的詮釋:

 

這里的藍色和粉色虛線框代表兩個不同的View(藍色的為A View、粉色的為B View),我們將需要轉化的矩形稱作M矩形

此時可以看到,M矩形在A View中的位置是藍色實線的矩形,而通過轉換M矩形在B View中變成了粉色實線的矩形。相當于一個投影,他們有自己獨立的參照系。

 



 

Adjusting the Size and Position of Views at Runtime 

  在程序的運行過程中,一個View的大小和位置可能發生變化,則他的subviews的大小和位置也應該會發生相應的變化。

Being Prepared for Layout Changes 

當以下的事件發生時,就會觸發Layout發生改變:

  • 一個View的bounds發生變化時
  • View的方向發生改變
  • 動畫
  • Application調用View的setNeedsLayout或者layoutIfNeed時
  • Application調用View的layer的setNeddsLayout時

Handling Layout Changes Automatically Using Autoresizing Rules 

關于這個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頁面中設置,但值得注意的是:

  • 上表中的UIViewAutoresizingFlexibleHeight、UIViewAutoresizingFlexibleWidth和inspector中所設置的結果是一致的
  • 而另外四個與inspector中所設置的結果是相反的,這個需要注意。

Important: Ifaview’stransformpropertydoesnotcontaintheidentitytransform,theframeofthatview is undefined and so are the results of its autoresizing behaviors. 

這個Important不是很懂。。。

Tweaking the Layout of Your Views Manually 

  當一個View在autoresing之后,如果他的Layout還達不到你的要求,則可以調用View的layoutSubviews函數,來調整你的subviews。

在 layoutSubviews函數中可以完成以下幾件事情

  • View可以調整任意一個direct subview的大小和位置
  • 添加和刪除subview或者動畫層
  • 通過調用subview的setNeedsDisplay和setNeedsDisplayInRect:函數來強制嗲用subview的redraw函數重新繪制subview

文檔中所提到的下面這段話,蠻有意思的,我覺得像淘寶這樣的app是不是就這個思想

 



Interacting with Core Animation Layers 

   每一個View對象都會有一個Core Animation Layer去控制他的動畫,而這個layer存放在View對象的layer屬性中。

Changing the Layer Class Associated with a View 

  通過實現layerClass函數來確定View的layer的類型,如下:

  這個就是再View類中重載了這個函數,并返回了想要的Layer的類型,值得注意的是,當View創建完成后,它的Layer的類型是不能改變的。

Embedding Layer Objects in a View 

  View中的Layer并不只是再創建的時候所生成的那一個,為我們可以新建一個Layer嵌入到View中,可以讓我們對Layer直接進行操作,而不是對View。這個新加入的Layer是無法進入Responder

chains的,但他可以完成一系列的動畫操作。



 

Defining a Custom View

Checklist for Implementing a Custom View

這里將介紹創建一個Custom View需要做的一系列操作:

1、實現一個適合的初始化函數

  • 用代碼的方式創建View-------initWithFrame:
  • 用Nib file實現View-------initWithCoder:

2、實現dealloc函數對聲明的數據進行處理

3、通過drawRect:實現所有的自定義畫圖

4、設置View的autoresizing屬性,來設定autoresizing behavior

5、如果你的view中還有Subviews,則需要完成以下操作:

  • 在View的初始化過程中創建Subviews
  • 在View的創建過程中設置subViews的autoresizingMask
  • 如果subViews需要自定義布局,則重載layoutSubviews函數,來是實現自定義布局

6、為了獲取基本的點擊事件,需要完成以下操作:

  • 通過addGestureRecognizer:函數添加合適的工作識別器到View
  • 通過重載以下函數來完成touch時間的操作

  touchesBegan:withEvent:

  touchesMoved:withEvent:

  touchesEnded:withEvent:

  touchesCancelled:withEvent:  

  注意:touchesCancelled:withEvent:  應該每次都實現,這樣就可以在結束時間監聽的時候忽略其他時間的響應函數。

7、自定義圖像的Print,實現drawRect:forViewPrintFormatter: 

Initializing Your Custom View

  • 用代碼的方式創建View-------initWithFrame:
  • 用Nib file實現View-------initWithCoder:

Implementing Your Drawing Code

  當對一個View進行自定義繪制的時候,需要重載他的drawRect:函數,并在這個函數里面實現繪制的代碼。但是需要注意,用drawRect:是最后的大招,如果能用別的方法來展示你的內容更好。

在drawRect:函數中,只能做有關繪圖的操作,不要加入與繪圖無關的操作,而且要求繪制的代碼要盡可能高效。

  在drawRect:中,UIKit已經將繪制環境配置好了,所以只用通過UIGraphicsGetCurrentContext 函數來獲取當前圖像的上下文,以下是一個簡單的drawRect:實現

OC:

Swift:

  這段代碼就是在view的(5,5)位置畫一個線的粗度為10的矩形框,顏色為藍色、紅色。

Responding to Events

1、View是可以回饋事件的,如果對時間不感興趣,可以將其忽略或者傳遞給Chains的上一級

2、View不止可以識別touch Event,還能加入更多,可用addGestureRecognizer:函數天劍

3、View默認情況下是支持單指點擊,通過設置multipleTouchEnabled=YES來支持多點操作

4、當View不需要相應Event時,可以設置userInteractionEnabeld屬性

5、對于整個Application可以通過beginIgnoringInteractionEvents 和 endIgnoringInteractionEvents來開啟和關閉App對事件的相應。

Cleaning Up After Your View 

  通過dealloc方法,來release在drawRect:中所產生的資源

 




 

Animation

主要介紹了Apple提供的動畫該如何去實現。

What Can Be Animated?

  UIKit和Core Animation都支持動畫,但他們兩個所支持的水平是不同的。

  在UIKit中,動畫是通過UIView對象來執行的,UIView只能完成一個常見的基本動畫,下表也出來UIVIew動畫所對應的屬性

  

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



 

Animating Property Changes in a View 

  為了動態的顯示UIView屬性的變化過程,必須將代碼寫進一個動畫塊中(Animation Block)

Starting Animation Using the Block-Based Methods

以下這三個函數,可以設置不同定制級別的動畫

  因為這些Block函數都是類函數,所以不會與單個View進行綁定,從而可以創建一個animation函數去控制多個View。

  下面的代碼是一個View淡出,一個View淡入,這個Animation Block在執行時會開啟一個新的線程,所以不會阻塞所在的線程和主線程,代碼如下:

OC:

 

Swift:

 

  上面的Animation Block只能完成ease-in、ease-out動畫,如果想要更多的效果需要調用

animateWithDuration:delay:options:animations:completion:  函數去自定義你的動畫,通過這個可以你讓你達到如下的效果:

  • 延時開始執行動畫
  • 不同的動畫方式
  • 動畫的重復次數
  • 動畫石頭需要往復執行
  • 當動畫執行過程中,有touch event該如何應對
  • 是否等待其他動畫執行完畢后再執行

例子代碼如下:

OC:

 

Swift:

Nesting Animation Blocks

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

OC:

 

Swift:

 



Creating Animated Transitions Between Views

  在View之間進行切換,可以有兩種方式的動畫去完成

  • 改變View中局部的subViews
  • 改變整個View為另外一個View

Changing the Subviews of a View 

  對一個View中的subViews進行添加或刪除的操作。可用函數

transitionWithView:duration:options:animations:completion: 

下面的例子就是實現了整個頁面的翻轉,如翻書一樣。但是只是更新了局部的內容,代碼如下:

OC:

Swift:

Replacing a View with a Different View 

  如果想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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚松县| 南召县| 武宁县| 乌审旗| 舒城县| 灯塔市| 开江县| 五大连池市| 咸丰县| 左云县| 高清| 阳朔县| 隆尧县| 江陵县| 桂林市| 新龙县| 临朐县| 梅河口市| 扎兰屯市| 昌黎县| 大邑县| 米易县| 贡山| 开化县| 漠河县| 汝南县| 西宁市| 广州市| 时尚| 台南市| 乡宁县| 赣州市| 辽源市| 河南省| 宿松县| 沙河市| 锦州市| 古丈县| 巨鹿县| 墨脱县| 鄂尔多斯市|