【发布时间】: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