摘要:UIViewController
在初始化該視圖時應該如何知道其UIView實例的大小?何處確定UIView大小
UIView的專用初始化方法是initWithFrame:(CGRect)frame
方法。這爲新創建的UIView設置了框架。如果請求該視圖控制器的視圖,則可以從UIViewController's
loadView方法調用此方法。的UIViewController
狀態相對於子類化和視圖大小的文檔:
當創建視圖 層次的意見,你應該總是設置您的看法 自動尺寸屬性。 當顯示 屏幕上的視圖控制器,其根視圖通常是 調整大小以適合可用的空間, 可以變化取決於 窗口的當前取向和 存在其他界面元素 如狀態欄的。
因此,UIViewController
實例應該設置這些屬性。迄今爲止,迄今爲止,UIViewController
並不需要知道其觀點是多大還是將會如此。
當請求UIViewController
的視圖並且視圖屬性爲零時,將調用視圖控制器的loadView方法。現在有一個問題,因爲UIView
需要初始化,但視圖控制器仍然不知道視圖應該是多大。你應該對這個觀點初始化多大?你在代碼中確定視圖大小?
你可以初始化一個零矩形視圖(CGRectZero
):
- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}
而讓主叫方設置視圖幀像這樣:
UIViewController *viewController = [[MyUIViewController alloc] init];
// next two lines are normally combined, but for clarity they are not now
UIView *view = viewController.view;
view.frame = CGRectMake(0, 0, 200, 200);
這從視圖控制器請求視圖(viewController.view),並因此使用loadView方法加載其視圖。此loadView方法使用CGRectZero
初始化視圖。然後調用者設置其框架(view.frame = ...)
問題是視圖上的框架屬性設置了兩次,如果您的自定義UIView
正在做一些高級佈局,則可能會導致更多的雙重工作setFrame方法(例如放置和調整子視圖的大小)。你可以通過爲UIViewController
創建一個專用的初始化方法來防止這種情況,該方法已經向調用者請求一個CGRect,你可以將它存儲在一個ivar中。在調用loadView方法時,您使用此ivar創建視圖。
這裏有什麼好方法?將視圖的框架設置兩次(初始化爲CGRectZero
,然後設置),或者給UIViewController
一個帶有CGRect的新的初始化方法(從而給它一個框架屬性)?或者我錯過了一些東西,還有其他的可能嗎?
的UIView的init方法實際上具有零矩形 – drvdijk 2009-07-09 12:43:16
現在我注意到調用initWithFrame,同時施加變換到一個視圖中, layoutSubviews被調用。考慮到我在視圖控制器的touchesMoved方法中應用了轉換,在layoutSubviews中做了很多工作也不會被推薦... – drvdijk 2009-07-15 12:28:19