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就可以了。
希望答案對你有所協助,如仍有疑惑,可以追問。