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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ios开发之UIView和UIViewController

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios开发之UIView和UIViewController 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

UIView 可以負責以下幾種任務:

  • 繪制和動畫
  • 布局和子視圖管理
  • 事件處理

繪制和動畫

視圖繪制

UIView 是按需繪制的,當整個視圖或者視圖的一部分由于布局變化,變成可見的,系統會要求視圖進行繪制。對于那些需要使用 UIKit 或者 CoreGraphics 進行自定義繪制的視圖,系統會調用?drawRect:?方法進行繪制。

當視圖內容發生變化時,需要調用?setNeedsDisplay?或者?setNeedsDisplayInRect:?方法,告訴系統該重新繪制這個視圖了。調用這個方法之后,系統會在下一個繪制周期更新這個視圖的內容。由于系統要等到下一個繪制周期才真正進行繪制,可以一次性對多個視圖調用?setNeedsDisplay,它們會同時被更新。

視圖的幾何屬性

視圖有 frame,center,bounds 等幾個基本幾何屬性,其中:

  • frame 使用的最多,其坐標位置都是相對于父視圖的,可以用于確定本視圖在父視圖中的位置和其自身的大小
  • center 的坐標位置也是相對于父視圖的,通常用于移動,旋轉等動畫操作
  • bounds 是相對于自身的,通常情況下就是(0,0,width,height), bounds 的含義可以認為是當前 view 被允許繪制的范圍

視圖的 ContentMode

視圖在初次繪制完成后,系統會對繪制結果進行快照,之后盡可能地使用快照,避免重新繪制。如果視圖的幾何屬性發生改變,系統會根據視圖的 contentMode 來決定如何改變顯示效果。

默認的 contentMode 是?UIViewContentModeScaleToFill?,系統會拉伸當前的快照,使其符合新的 frame 尺寸。大部分 contentMode 都會對當前的快照進行拉伸或者移動等操作。如果需要重新繪制,可以把 contentMode 設置為?UIViewContentModeRedraw,強制視圖在改變大小之類的操作時調用drawRect:重繪。

動畫

可以以動畫的形式改變視圖的下面這些屬性,只需要告訴系統動畫開始和結束時的數值,系統會自動處理中間的過渡過程。

frame bounds center transform alpha backgroundColor contentStretch

?

布局和子視圖管理

除了提供視圖本身的內容之外,一個視圖也可以表現得像一個容器。當一個視圖包含其他視圖時,兩個視圖之間就創建了一個父子關系。在這個關系中子視圖被稱為 subView ,父視圖被稱為 superView 。一個視圖可以包含多個子視圖,它們被存放在這個視圖的?subviews?數組里。添加,刪除,以及操作這些子視圖的相對位置的函數如下:

addSubview: insertSubview:... bringSubviewToFront: sendSubviewToBack: exchangeSubviewAtIndex:withSubviewAtIndex: removeFromSuperview(子視圖調用)

?

AutoResizing 和 Constraint

當一個視圖的大小改變時,它的子視圖的位置和大小也需要相應地改變。UIView 支持自動布局,也可以手動對子視圖進行布局。

當下列這些事件發生時,需要進行布局操作:

  • 視圖的 bounds 大小改變#
  • 用戶界面旋轉,通常會導致根視圖控制器的大小改變
  • 視圖的 layer 層的 Core Animation sublayers 發生改變
  • 程序調用視圖的setNeedsLayout或layoutIfNeeded方法
  • 程序調用視圖 layer 的setNeedsLayout方法

Auto Resizing

視圖的autoresizesSubviews屬性決定了在視圖大小發生變化時,如何自動調節子視圖。

可以使用的掩碼如下:

UIViewAutoresizingNone UIViewAutoresizingFlexibleHeight UIViewAutoresizingFlexibleWidth UIViewAutoresizingFlexibleLeftMargin UIViewAutoresizingFlexibleRightMargin UIViewAutoresizingFlexibleBottomMargin UIViewAutoresizingFlexibleTopMargin

?

可以通過位運算符將它們組合起來,例如?UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth。

Constraint

Constraint 是另一種用于自動布局的方法。本質上,Constraint 就是對 UIView 之間兩個屬性的一個約束:

attribute1 == multiplier × attribute2 + constant

?

其中方程兩邊不一定是等于關系,也可以是大于等于之類的關系。

Constraint 比 AutoResizing 更加靈活和強大,可以實現復雜的子視圖布局。

自定義 layout

UIView 當中提供了一個?layoutSubviews?函數,UIView 的子類可以重載這個函數,以實現更加復雜和精細的子 View 布局。

蘋果文檔專門強調了,應該只在上面提到的 Autoresizing 和 Constraint 機制不能實現所需要的效果時,才使用?layoutSubviews。而且,layoutSubviews 方法只能被系統觸發調用,程序員不能手動直接調用該方法。

那么 layoutSubviews 方法具體調用的時機有哪些呢?具體有下面幾種情況:

  • 在父 view 的 autoresize mask 為 ON 的情況下,addSubview 會導致被 add 的 view 調用 layoutSubviews, 同時 add 的 target view 以及它所有的子 view 都會被調用。
  • setFrame 當新的 frame 和 舊的不同時(即 view 的大小改變時)會調用 layoutSubviews
  • 滾動一個 UIScollView 會導致這個 scrollView 以及它的父 View 調用 layoutSubviews
  • 旋轉設備會導致當前所響應的 ViewController 的主 View 調用 layoutSubviews
  • 改變 View 的 size 會導致父 View 調用 layoutSubviews
  • removeFromSuperview 也會導致父 View 調用 layoutSubviews
  • 事件處理

    UIView 是 UIResponder 的子類,可以響應觸控事件。

    通常可以使用?addGestureRecognizer:?添加手勢識別器來響應觸控事件,如果需要手動處理,則按需要重載 UIView 中的下面四個函數:

    touchesBegan:withEvent: touchesMoved:withEvent: touchesEnded:withEvent: touchesCancelled:withEvent:

    ?

    ?

    UIViewController(視圖控制器),顧名思義,是 MVC 設計模式中的控制器部分。UIViewController 在 UIKit 中主要功能是用于控制畫面的切換,其中的?view?屬性(UIView 類型)管理整個畫面的外觀。

    UIViewController 生命周期

    ViewController 生命周期的第一步是初始化。不過具體調用的方法還有所不同。如果使用 StoryBoard 來創建 ViewController,我們不需要顯式地去初始化,Storyboard 會自動使用?initWithCoder:?進行初始化。如果不使用 StoryBoard,我們可以使用?init:?函數進行初始化,init:?函數在實現過程中還會調用?initWithNibName:bundle:。 我們應該盡量避免在 VC 外部調用?initWithNibName:bundle:,而是把它放在 VC 的內部(參考這里)。

    初始化完成后,VC 的生命周期會經過下面幾個函數:

    (void)loadView (void)viewDidLoad (void)viewWillAppear (void)viewWillLayoutSubviews (void)viewDidLayoutSubviews (void)viewDidAppear (void)viewWillDisappear (void)viewDidDisappear

    ?

    假設現在有一個 AViewController(簡稱 Avc) 和 BViewController (簡稱 Bvc),通過 navigationController 的 push 實現 Avc 到 Bvc 的跳轉,下面是各個方法的執行執行順序:

    1. A viewDidLoad 2. A viewWillAppear 3. A viewDidAppear 4. B viewDidLoad 5. A viewWillDisappear 6. B viewWillAppear 7. A viewDidDisappear 8. B viewDidAppear

    ?

    如果再從 Bvc 跳回 Avc,會產生下面的執行順序:

    1. B viewWillDisappear 2. A viewWillAppear 3. B viewDidDisappear 4. A viewDidAppear

    ?

    可見 viewDidLoad 只會調用一次,再第二次跳回 Avc 的時候,AViewController 仍然存在于內存中,也就不需要 load 了。

    注意上面的生命周期中都沒有提到有關 ViewController 銷毀的內容,在 iOS 4 & 5 中 ViewController 中有一個?viewDidUnload?方法。當內存不足,應用收到 Memory warning 時,系統會自動調用當前沒在界面上的 ViewController 的 viewDidUnload 方法。 通常情況下,這些未顯示在界面上的 ViewController 是 UINavigationController Push 棧中未在棧頂的 ViewController,以及 UITabBarViewController 中未顯示的子 ViewController。這些 View Controller 都會在 Memory Warning 事件發生時,被系統自動調用 viewDidUnload 方法。

    從 iOS 6 開始,viewDidUnload 方法被廢棄掉了,應用受到 memory warning 時也不會再調用 viewDidUnload 方法。我們可以通過重載?- (void)didReceiveMemoryWarning?和?-(void)dealloc?來進行清理工作。

    轉載于:https://www.cnblogs.com/qisi007/p/11073227.html

    總結

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

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