2016년 8월 9일 화요일

NSPopover Cheatsheet

NSPopover는 말풍선 모양의 팝업윈도우 컴포넌트이다. 미려한(?) UI를 구성하는데 필수적이기 때문에 정리해 본다.


Show Popover

NSPopover를 이용해 팝오버를 띄우는 것은 간단하다. 다만 몇 가지 준비가 필요하다. 팝오버가 표시될 위치와 뷰컨트롤러이다.
@IBAction func pressedSomeButton(sender: AnyObject) {
  // View Controller containing Contents (표시할 뷰 컨트롤러 객체를 얻는다)
  let viewController = SomeViewController(nibName: "SomeViewController", bundle: nil)

  // Create Popover (팝오버를 만들자)
  let popover = NSPopover()
  popover.contentViewController = viewController
  popover.animates = true
    
  // Getting Relative Frame (팝오버를 표시할 좌표를 얻기 위해 버튼 정보를 참조하기)
  let button = sender as NSButton

  // Show!
  popover.showRelativeToRect(button.frame, ofView: self.view, preferredEdge: NSRectEdge.MinY)
}
preferredEdge 에서 사용되는 MinY 값은 '버튼의 아래쪽에 팝오버 꼬리가 위치하게 한다' 는 의미로 이해하면 된다. 만약 MaxY 로 설정하면 버튼의 윗쪽에 팝오버 꼬리가 위치하게 된다.

Hide when click outside of Popover

요즘은 팝오버가 아닌 곳을 클릭하면 팝오버 창이 닫히는게 일반적인 추세(?)이다. 다행히도 behavior라는 프로퍼티를 세팅해서 간단히 구현하는 것이 가능하다. 아래 한 줄을 팝오버를 표시하기 전에 추가하면 된다.
popover.behavior = NSPopoverBehavior.Transient

Resize Popover

만약 contentViewController로 넘겨주는 뷰 컨트롤러의 뷰 크기가 다이나믹하게 바뀌는 상황이라면 어떻게 될까. 팝오버는 처음 넘겨준 사이즈 대로만 뜨게 된다. 그래서 크기가 안맞게 보이거나, 오토레이아웃 설정 등에 따라서 뷰 모양이 일그러 질 수도 있다.

이 경우 팝오버의 contentSize라는 프로퍼티를 세팅해 주면 사이즈를 바꾸는 것이 가능하다.
popover.contentSize = viewController.view.frame.size

댓글 없음 :