2014-09-03 62 views
0

替換的視圖,當在我的申請,我有:保持約束由其他視圖

  • 主窗口中,包含「自定義視圖」,這是一個的NSView 在IB丟棄。
  • 一個視圖控制器+另一個筆尖,包含一個視圖和一些 控件。

當應用程序加載時,我使用:

initWithNibName:nibName andReplaceView:(the custom view) resize:YES

要更換自定義視圖。我知道在IB中有一個選項placeholder,但我不知道如何使用它,並且我的應用程序以這種方式運行良好... ...除了加載的視圖不繼承佈局約束替換視圖。

我該如何解決這個問題?

編輯:對不起,我忘了該功能是我的...我很久以前在一個類別中寫了它。以下是代碼:

- (id)initWithNibName:(NSString*)nibName andReplaceView:(NSView*)aView resize:(BOOL)resize 
{ 
    // 1. Loading the bundle 
    if (self = [self initWithNibName:nibName bundle:nil]) 
    { 
     [self replaceView:aView resize:resize]; 
    } 

    return self;  
} 

- (void)replaceView:(NSView*)aView resize:(BOOL)resize 
{ 
    if (resize) 
    { 
     NSRect insertionFrame = [aView frame]; 
     [[self view] setFrame:insertionFrame]; 
    } 
    else 
    { 
     NSRect insertionFrame = [aView frame]; 
     insertionFrame.size.width = [[self view] frame].size.width; 
     insertionFrame.size.height = [[self view] frame].size.height; 

     [[self view] setFrame:insertionFrame]; 
    } 

    NSView* supView = [aView superview]; 
    [supView replaceSubview:aView with:[self view]]; 
} 
+0

' - initWithNibName:andReplaceView:resize:'does not exist ...。 – Jean 2014-09-03 08:03:19

+0

'-replaceView:resize:'也是自定義的,所以我們無法知道它做了什麼。 – 2014-09-03 08:10:54

+0

@TomDalling我已更新我的帖子。抱歉。我在2年或3年前寫過他們... – Adeline 2014-09-03 08:11:34

回答

1

當您替換視圖時,它將刪除附加到舊視圖的所有佈局約束。

就我個人而言,我只是把新視圖放在舊視圖中。這裏是我用過的一些代碼:

@implementation SJPlaceholderView 

-(void) fillWithView:(NSView*)view { 
    NSParameterAssert(view); 

    view.frame = self.bounds; 
    [view setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [self addSubview:view]; 

    [self addConstraints: 
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" 
              options:0 
              metrics:nil 
               views:NSDictionaryOfVariableBindings(view)]]; 

    [self addConstraints: 
    [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" 
              options:0 
              metrics:nil 
               views:NSDictionaryOfVariableBindings(view)]]; 
} 

@end 

這確保內部視圖框架與外部視圖框架完全匹配。外部視圖上的所有佈局約束仍然有效。

您也可以嘗試遍歷舊視圖的所有約束,並將它們應用於新視圖。大部分約束條件都是在視圖本身或超視圖上,但理論上它們可以在任何祖先視圖上。

+0

在舊版本中添加viwe是個不錯的主意。資源現在不是一個問題。添加的視圖是否會像舊的底層視圖一樣重新調整大小? – Adeline 2014-09-03 08:38:15

+0

@Adeline是的,添加的視圖框架受到限制,以便它始終匹配底層視圖框架。 – 2014-09-03 08:49:51

+0

最後一個問題(因爲我不能使它工作)fillWithView將被調用在舊的或新的視圖? – Adeline 2014-09-03 08:56:32