ios – 視圖,ios視圖

來源:互聯網
上載者:User

ios – 視圖,ios視圖

視圖是使用者在螢幕上所看到的,也是使用者通過觸控螢幕幕進行互動的東西,因此視圖是一個應用可視化 可觸摸表現的主要組成部分。

1.1 子視圖和父視圖

UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 150, 200, 200)];v1.backgroundColor = [UIColor redColor];UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 80, 80)];v2.backgroundColor = [UIColor greenColor];UIView *V3 = [[UIView alloc] initWithFrame:CGRectMake(70, 70, 80, 80)];V3.backgroundColor = [UIColor blackColor];    [self.view addSubview:v1];[v1 addSubview:v2];[v1 addSubview:V3];

上面的代碼建立了視圖 v1 v2 v3,v2 v3是v1的子視圖 。

運行結果:不同層級時:父視圖先繪製

相同層級時:“更早”加入的視圖先繪製

視圖階層的其他效果:

  • 如果視圖從它的父視圖移除或移入,它的子視圖將會和它一起

  • 如果視圖的尺寸改變,它的子視圖能夠自動重新調整尺寸

  • 視圖的透明度將會被子視圖繼承

  • 視圖可以選擇性的限制它的子視圖的繪製,這樣任何視圖之外的部分都不會顯示,這稱為剪下,並且是通過設定視圖的clipsToBounds屬性進行控制的。

  • 父視圖擁有他們的子視圖,從記憶體管理的角度來看,和NSArray擁有他們的元素很像,它保留它們並負責當該子視圖不再是它的子視圖的時候(從這個視圖的子視圖集合移除)或者不再存在時釋放它們。

UIView有一個superview屬性(一個UIView)和subviews屬性(一個由UIView組成的NSArray)。

1.2 應用程式視窗

視圖的頂層是視窗UIWindow(UIView的子類),一個應用至少有一個UIWindow的執行個體,該執行個體佔據整個螢幕,是其他所有可見視圖的最終父視圖。

應用建立視窗有三種方法:

第一種是不使用xib和串聯圖,用代碼建立,代碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // Override point for customization after application launch.    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    [self.window makeKeyAndVisible];    return YES;}

application:didFinishLaunchingWithOptions:是應用程式委託的一個方法,應用完成啟動的時候會調用這個方法,UIWindow執行個體必須在應用的整個生命週期中存在,所以委託中有個一window保留它,makeKeyAndVisible訊息用以顯示應用介面.

第二種是使用串聯圖:

這種辦法不需要寫任何代碼,我現在xcode的版本是6.0,建立項目選擇single view會自動建立一個串聯圖(.storyboard檔案),在Info.plist檔案中的“Main storyboard file base name”指定即可,預設已經指定了,當然也可以自己建立一個storyboard檔案重新指定。

在這種情況下,UIApplicationMain執行個體化應用程式委託後,它會請求委託的window屬性,如果為nil,UIApplicationMain將會建立一個UIWindow執行個體並賦值給委託的window屬性,串聯圖的initial view controller(初始視圖控制器)執行個體化並賦值給window的rootViewController屬性,隨後向window發送makeKeyAndVisible訊息以顯示出來,這些都是UIApplicationMain在後台完成的,所以application:didFinishLaunchingWithOptions:方法的實現是空的。

第三種是使用xib檔案:

1.刪除Info.plist檔案中的“Main storyboard file base name”一項。

2.建立一個xib檔案,拖一個Window到畫布中(包含一個Window就行)。

3.將xib檔案 File's Owner的Identity inspector中的class設定為應用程式代理程式類。

4.在代理類中添加如下屬性:

@property (strong, nonatomic) IBOutlet UIWindow *window;

(代理類的標頭檔原本有window屬性,改成上面一樣即可)

5.將window屬性串連起來。

6.在application:didFinishLaunchingWithOptions:方法中載入xib檔案,代碼如下:

[[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil];

1.3 視圖的幾個重要屬性

1 frame  聲明如下:

@property(nonatomic) CGRect            frame;

frame  表示的是視圖矩陣在父視圖中的位置,用的是父視圖的座標系統,預設情況下,父視圖的座標系統會以左上方為原點,x座標向右,y座標向下,視圖建立的時候應該設定frame  ,就像上面那樣,不設定的話 它的預設值是{{0,0},{0,0}}。

2 bounds 聲明如下:

@property(nonatomic) CGRect            bounds;

bounds 和 frame  只有唯一一個不同點,

frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)

bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)

3 center 聲明如下:

@property(nonatomic) CGPoint           center;

center 無論從字面意思還是類型來看都知道表示的是一個中心點,和bounds一樣參照點是本身座標系統。

4 transform 聲明如下:

@property(nonatomic) CGAffineTransform transform;

transform 用來提供旋轉 縮放 平移子類的變換,預設情況下transform的值為CGAffineTransformIdentity(沒有可見效果),視圖的任何變換都是圍繞center來進行的,center保持不變。

改變transform 的值使用以“CGAffineTransformMake” 開頭的函數。

示範:

 

UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 150, 200, 200)];v1.backgroundColor = [UIColor redColor];[self.view addSubview:v1];v1.transform = CGAffineTransformMakeRotation(45 * M_PI/180);

 

其他變換效果都大同小異,就不一一示範了。


iOS開發,視圖切換問題

有兩種方法
1.主要是根據情況設定誰為window.rootViewcontroller的問題。在appdelegate.h檔案中監聽通知,登入與退出。在預設載入時window.rootViewcontroller 設定為登入的viewcontroller。當登入成功後發送通知,在appdelegate中接收通知,將修改window.rootViewController為uitabbarcontroller.相應的當退出時,發送退出通知,這時在appdelegate中接收到退出通知,將window.rootViewController設定為登入的viewcontroller.

2. 預設就設定uitabbarController為window.rootViewController. 在登入時使用presentviewcontroller彈出登入的viewcontroller.這樣你看到的第一個視圖就是登入的視圖。當登入成功後dismiss登入viewcontroller,發通知重新reload tabbarcontroller 。退出時重新present登入視窗就可以了

我的建議是使用第二種方法,這種方法可以處理那種也不需要登入也可以查看某些內容的app.當需要登入時present出來登入視圖就可以了。
 
ios開發中怎刪除子視圖

如果你是想找到某個視圖中的一個特定的子視圖,並且將其移除,方法如下:

//依次遍曆self.view中的所有子視圖
for(id tmpView in [self.viewsubviews])
{
//找到要刪除的子視圖的對象
if([tmpView isKindOfClass:[UIImageViewclass]])
{
UIImageView *imgView = (UIImageView *)tmpView;
if(imgView.tag == 1) //判斷是否滿足自己要刪除的子視圖的條件
{
[imgView removeFromSuperview]; //刪除子視圖

break; //跳出for迴圈,因為子視圖已經找到,無須往下遍曆
}
}
}

如果你是想徹底釋放此視圖,直接release或者autorelease就可以了。
希望答案對你有所協助,如仍有疑惑,可以追問。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.