2014-02-26 296 views
5

我有麻煩讓我的子視圖正確調整使用Autolayout。爲了說明我的觀點,我整理了一個簡約的例子。Cocoa Autolayout和子視圖調整大小

首先,我創建了一個新的NSViewController並添加了一個子視圖(在這個特殊情況下是一個NSTextView)並添加了Autolayout約束。

enter image description here

我加入自定義視圖我MainMenu.xib並設置自動佈局約束太多。

enter image description here

最後,我創建了視圖控制器的實例,並把它認爲我的自定義視圖中。

#import "AppDelegate.h" 
#import "MyViewController.h" 

@interface AppDelegate() 
@property (weak) IBOutlet NSView *customView; 
@end 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 

    [self.customView addSubview:myViewController.view]; 
    myViewController.view.frame = self.customView.bounds; 
} 

@end 

由於「Autoresizes子視圖」在這兩個XIB文件被選中,我預計NSTextView當我調整主窗口調整大小。但是,它只是停留在原地。

enter image description here

缺少什麼我在這裏?這讓我困惑了幾天。

感謝, 邁克爾·克努森

回答

3

你NSTextView包含視圖不必其父任何約束,在這種情況下,你的窗口。您添加的視圖沒有調整大小,因爲您的視圖並未通過其父項的約束「連接」。如果您想以編程方式執行此操作,您可能需要調查addConstraint:方法。

請參閱Apple's docs瞭解更多信息。

+0

如果你看看我的文章的第一張截圖,看來該NSTextView(或者更準確地說是在NSScrollView其所嵌入)是我的視圖控制器的IBOutlet中視圖的子視圖。自動佈局約束與該觀點有關,對吧? –

+0

我其實是通過編程來做實驗,但不知何故,最終導致我無法調整任何東西。在編程添加視圖後,很難簡單地「抓住」窗口邊角。猜猜現在是時候回到文檔並再次嘗試。 –

+0

是的,自動佈局約束是關於文本視圖的*視圖*(即父視圖)的。 – SevenBits

8

以防其他人遇到同樣的問題。我最終以這種方式解決了這個問題(感謝@SevenBits指出我在這個方向)。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 

    [self.customView addSubview:myViewController.view]; 

    myViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView]|" 
                      options:0 
                      metrics:nil 
                      views:@{@"subView" : myViewController.view}]; 

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView]|" 
                      options:0 
                      metrics:nil 
                      views:@{@"subView" : myViewController.view}]; 

    [self.customView addConstraints:verticalConstraints]; 
    [self.customView addConstraints:horizontalConstraints]; 
} 
+1

輝煌。這應該是被接受的答案。 – RajV

相關問題