2014-12-20 2 views
7

OSX 10.10에서 Xcode 6.1.1을 작업 중입니다. 나는 맥 애플 리케이션을위한 스토리 보드를 시험하고있다. 새로운 NSTabViewControllerTabStyleToolbartabStyle을 사용하는 NSTabViewController가 있으며이 컨트롤은 윈도우 컨트롤러의 기본보기 컨트롤러로 설정됩니다. 현재 선택한보기 컨트롤러에 따라 창 크기를 조정하려면 어떻게해야합니까?스토리 보드에서 컨트롤러 크기를보기 위해 창 크기 조정

전적으로 Interface Builder에서 할 수 있습니까? storyboard

답변

10

자동 레이아웃 대답은 그 중 절반입니다. 각 탭에 대한 ViewController의 preferredContentSize를 피팅 크기로 설정해야합니다 (탭이 모든 제약 조건을 만족하는 가장 작은 크기로 크기를 조정하려는 경우). 아래에 고정 된 크기, 스위프트 여기에 사용되는 탭 항목의 뷰 컨트롤러의 viewWillAppear 함수의 집합이 (아래의 예를 먼저 시도하지만, 목표 - C 버전뿐만 아니라 단지 작동

override func viewWillAppear() { 
     super.viewWillAppear() 
     preferredContentSize = view.fittingSize 
} 

제약 조건이 문제가 발생하는 경우).

override func viewWillAppear() { 
     super.viewWillAppear() 
     preferredContentSize = NSSize(width: 400, height: 280) 
} 

이 작동하는 경우, 귀하의 제약 바이올린이

+1

이 작동하지만 높이보기 애니메이션이 움직이지 않습니다. 해당 탭을 선택하면 새 크기로 다시 그립니다. 애니메이션 높이 변경을 지원하는 트릭이 있습니까? – mixtly87

-2

사용이을 자동 레이아웃 : 여기처럼 내 스토리 보드는 모습입니다. 보기에 명시적인 크기 제한을 설정하십시오. 또는 각 탭보기 항목의보기에 UI를 입력하면보기가 원하는 크기가되도록 강제로 내부 제약 조건을 설정합니다.

+2

포함 된보기 컨트롤러에 제약 조건을 추가해도 창 크기가 조정되지 않습니다. –

0

에 애니메이션 않는다 '도구 모음 스타일'탭보기 컨트롤러에이 솔루션을 가서 멋진 크로스 페이드 효과를 지원 있는지 파악합니다. 스토리 보드 디자이너에서 NSTabViewController의 사용자 정의 클래스 이름 필드에 'TabViewController'를 추가하십시오. 각 viewController에 제목을 할당하는 것을 잊지 마세요, 이것이 키 값으로 사용됩니다.

import Cocoa 

class TabViewController: NSTabViewController { 

    private lazy var tabViewSizes: [String : NSSize] = [:] 

    override func viewDidLoad() { 
     // Add size of first tab to tabViewSizes 
     if let viewController = self.tabViewItems.first?.viewController, let title = viewController.title { 
      tabViewSizes[title] = viewController.view.frame.size 
     } 
     super.viewDidLoad() 
    } 

    override func transition(from fromViewController: NSViewController, to toViewController: NSViewController, options: NSViewController.TransitionOptions, completionHandler completion: (() -> Void)?) { 

     NSAnimationContext.runAnimationGroup({ context in 
      context.duration = 0.5 
      self.updateWindowFrameAnimated(viewController: toViewController) 
      super.transition(from: fromViewController, to: toViewController, options: [.crossfade, .allowUserInteraction], completionHandler: completion) 
     }, completionHandler: nil) 
    } 

    func updateWindowFrameAnimated(viewController: NSViewController) { 

     guard let title = viewController.title, let window = view.window else { 
      return 
     } 

     let contentSize: NSSize 

     if tabViewSizes.keys.contains(title) { 
      contentSize = tabViewSizes[title]! 
     } 
     else { 
      contentSize = viewController.view.frame.size 
      tabViewSizes[title] = contentSize 
     } 

     let newWindowSize = window.frameRect(forContentRect: NSRect(origin: NSPoint.zero, size: contentSize)).size 

     var frame = window.frame 
     frame.origin.y += frame.height 
     frame.origin.y -= newWindowSize.height 
     frame.size = newWindowSize 
     window.animator().setFrame(frame, display: false) 
    } 
}