如何在使用自动布局时使用动画折叠NSSplitView窗格?

mdi*_*iep 7 cocoa appkit nssplitview

我已经尝试了我能想到的所有内容,包括我在SO和其他邮件列表中找到的所有建议,但我无法弄清楚如何NSSplitView在启用"自动布局"时以编程方式折叠带有动画的窗格.

这就是我现在所拥有的(用Swift编写的乐趣),但它有多种方式:

@IBAction func toggleSourceList(sender: AnyObject?) {
    let isOpen = !splitView.isSubviewCollapsed(sourceList.view.superview!)
    let position = (isOpen ? 0 : self.lastWidth)

    if isOpen {
        self.lastWidth = sourceList.view.frame.size.width
    }

    NSAnimationContext.runAnimationGroup({ context in
        context.allowsImplicitAnimation = true
        context.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
        context.duration = self.duration

        self.splitView.setPosition(position, ofDividerAtIndex: 0)
    }, completionHandler: { () -> Void in
    })
}
Run Code Online (Sandbox Code Playgroud)

期望的行为和外观是Mail.app,它的动画效果非常好.

我在https://github.com/mdiep/NSSplitViewTest上有一个完整的示例应用程序.

小智 18

Objective-C的:

[[splitViewItem animator] setCollapse:YES]
Run Code Online (Sandbox Code Playgroud)

迅速:

splitViewItem.animator().collapsed = true
Run Code Online (Sandbox Code Playgroud)

来自Apple的帮助:

是否在SplitViewController中折叠了与SplitViewItem对应的子ViewController.默认值为NO.可以使用动画制作代理设置此操作以设置折叠或解除折叠的动画.使用的精确动画可以通过使用"折叠"键在-animations字典中设置来自定义.如果在将它添加到SplitViewController之前将其设置为YES,则它最初将被折叠,并且SplitViewController将不会导致视图加载,直到它被解除.这符合KVC/KVO标准,如果值因用户交互而变化,则会更新.

  • 我明白.但NSSplitViewItem仅在10.10及更高版本上可用. (3认同)

Pau*_*son 0

如果您使用自动布局并且想要对视图尺寸/位置的某些方面进行动画处理,那么您可能会更幸运地对约束本身进行动画处理。我已经快速尝试过,NSSplitView但到目前为止只取得了有限的成功。我可以在按下按钮后进行拆分以展开和折叠,但最终我不得不尝试解决由于干扰约束而引起的许多其他问题。如果您不熟悉它,这里有一个简单的约束动画:

- (IBAction)animate:(NSButton *)sender {
    /* Shrink view to invisible */

    NSLayoutConstraint *constraint = self.viewWidthConstraint;
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {

        [[NSAnimationContext currentContext] setDuration:0.33];
        [[NSAnimationContext currentContext] setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
        [[constraint animator] setConstant:0];

    } completionHandler:^{
        /* Do Some clean-up, if required */

    }];
Run Code Online (Sandbox Code Playgroud)

请记住,您只能为约束设置动画constant,而不能为其设置动画priority