如何使用自动布局实现NSSplitView的折叠动画

3

我在XIB中使用自动布局设置了如下所示的接口。

[Left Pane]-[Center Pane]-[Right Pane]
[            Bottom Pane             ]

目前,它支持每个窗格的最大和最小宽度/高度以及通过双击分隔符或使用NSSegmentedControl折叠子视图。现在我想要做的是动画折叠当用户切换NSSegmentedControl时发生的情况。我已经看到很多关于使用NSSplitView设置动画来折叠子视图的示例,但没有一个使用自动布局来实现它。
我尝试遵循WWDC 2012年有关自动布局演示的约束动画演示,但由于这是我第一次启用自动布局,我还没有弄清楚如何做到这一点。
以下是我目前拥有的内容。
NSArray *constraints = [self.leftPane constraints];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [constraints filteredArrayUsingPredicate:predicate];

[self.leftPane removeConstraints:filteredArray];

[self.lcrSplitView layoutSubtreeIfNeeded];

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setAllowsImplicitAnimation:YES];

    NSLayoutConstraint *newWidth = [NSLayoutConstraint constraintWithItem:self.leftPane
                                                                attribute:NSLayoutAttributeWidth
                                                                relatedBy:NSLayoutRelationEqual
                                                                   toItem:nil
                                                                attribute:NSLayoutAttributeNotAnAttribute
                                                               multiplier:0.0f
                                                                 constant:0.0f];

    [self.leftPane addConstraint:newWidth];


    [self.lcrSplitView layoutSubtreeIfNeeded];
} completionHandler:^{}];

你解决了吗?我有和你完全一样的遭遇,包括我也只是跟着 WWDC 2012 的演示进行的。我们之间唯一不同的是,我实际上除了左、中、右和底部面板外,还有一个顶部面板。 - ArtOfWarfare
我目前还没有一个带有动画的解决方案,但这可能会对他人感兴趣:https://dev59.com/QnNA5IYBdhLWcg3whuZ_#20027805。 - ArtOfWarfare
@ArtOfWarfare,我最终让它工作了,但是它非常复杂,容易出错。由于某种原因,在Mountain Lion上它可以正常工作,但在Mavericks上却非常卡顿。所以我放弃了它,创建了自己的NSViewController子类,其中包含4个子视图,并滚动了自己定制的NSSplitView。为了解决这个问题带来的头痛,我还放弃了这个项目中的自动布局,只使用了Spring和Struts。我知道这很伤人,但我建议你自己创建一个分割视图实现... - xizor
我花了大约5个小时才得到了真正强大的东西,而我已经花费了40-80个小时来调试和解决上述问题。 - xizor
很高兴听到只需要5小时。几年前,我为原始的iOS SDK创建了一个分割视图类,所以对我来说这不是什么新鲜事。我只想尽可能使用多个标准工具。目前,我将继续使用我发现NSSplitView有的私有方法(我在链接答案中描述了访问它),并请求苹果将其添加到公共SDK中。 - ArtOfWarfare
1个回答

1

对于任何目标定位于10.11 El Capitan的人来说,这对我很有帮助。

splitViewItem.collapsed = YES;

这太完美了,谢谢!只是再补充一点,NSSplitViewItemcollapsed属性是在10.10中引入的。此外,要动画过渡,请使用splitViewItem.animator.collapsed = YES; - Demitri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接