2017-08-24 7 views
0

シリウスウィンドウのようなスライド右のアニメーションを作りたいです。したがって、ユーザーのクリックボタンの後、私が行いますウィンドウコントローラーでnswindowアニメーターが動作しない

self.myWindowController.showWindow(nil) 

ウィンドウコントローラの場合:1秒の遅延の後に、アニメーションせずに正しい位置をトップに

override func windowDidLoad() { 
     super.windowDidLoad() 

     if let window = window, let screen = window.screen { 
      window.makeKeyAndOrderFront(nil) 
      window.animationBehavior = .none 

      let offsetFromLeftOfScreen: CGFloat = 30 
      let offsetFromTopOfScreen: CGFloat = 30 
      let screenRect = screen.visibleFrame 
      let newOriginX = screenRect.maxX - window.frame.width - offsetFromLeftOfScreen 
      let newOriginY = screenRect.maxY - window.frame.height - offsetFromTopOfScreen 

      DispatchQueue.main.asyncAfter(deadline: .now()+1.0) { 
       NSAnimationContext.beginGrouping() 
       NSAnimationContext.current().duration = 3.0 
       window.animator().setFrameOrigin(NSPoint(x: newOriginX, y: newOriginY)) 
       NSAnimationContext.endGrouping() 
      } 

      window.titleVisibility = .hidden 
     } 

しかし、窓の動きを。どうして ?

答えて

2

私はフレームをリセットするために別のAPIを使用すると思います。あなたがあなた自身の描画を行っている場合を除きます。また、明示的animationBehaviorプロパティを設定する必要はありません

let newFrame = CGRect(x: newOriginX, y: newOriginY, width: window.frame.size.width, height: window.frame.size.height) 
    DispatchQueue.main.asyncAfter(deadline: .now()+1.0) { 
     NSAnimationContext.runAnimationGroup({ (context) in 
      context.duration = 3.0 

      window.animator().setFrame(newFrame, display: true, animate: true) 
     }, completionHandler: { 
      print("animation done") 
     }) 
    } 

はこのような何かをやってみてください。それを取り出してください。

関連する問題