【问题标题】:How can I animate NSSplitView collapse with auto layout如何使用自动布局动画 NSSplitView 折叠
【发布时间】:2015-12-12 00:24:16
【问题描述】:

我有一个如下设计的界面,在 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 演示。我们之间唯一不同的是,除了左侧、中间、右侧和底部窗格之外,我实际上还有一个顶部窗格。
  • 我还没有动画的解决方案,但其他人可能对此感兴趣:stackoverflow.com/a/20027805/901641
  • @ArtOfWarfare,我最终得到了一些工作,但它非常复杂并且容易出错。出于某种原因,它在 Mountain Lion 上可以正常工作,但在 Mavericks 上却不行(它会非常生涩)。所以我最终放弃了它并创建了我自己的包含 4 个子视图的 NSViewController 子类并滚动了我自己定制的 NSSplitView。我也放弃了这个项目的自动布局,只使用了弹簧和支柱,主要是因为这个问题引起了很多头痛。我知道听着很痛苦,但我建议您创建自己的拆分视图实现。 ...
  • ... 我花了大约 5 个小时才得到真正强大的东西,而我已经花了 40-80 次调试和解决上述问题。
  • 很高兴听到它只需要 5 个小时。几年前我为原始 iOS SDK 制作了一个拆分视图类,所以它对我来说并不是什么新鲜事。我只想使用尽可能多的标准工具。现在,我将坚持使用我发现 NSSplitView 拥有的私有方法(我在链接的答案中描述了访问它)并请求 Apple 将其添加到公共 SDK。

标签: cocoa core-animation autolayout nssplitview


【解决方案1】:

对于任何以 10.11 El Capitan 为目标的人来说,这对我有用。

splitViewItem.collapsed = YES;

【讨论】:

  • 这是完美的,谢谢!再补充一点,NSSplitViewItemcollapsed 属性是在 10.10 中引入的。此外,要为过渡设置动画,请使用 splitViewItem.animator.collapsed = YES;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
相关资源
最近更新 更多