gpt4 book ai didi

cocoa - 动画自动布局更改与 NSPopover contentSize 更改同时发生

转载 作者:行者123 更新时间:2023-12-03 16:11:19 33 4
gpt4 key购买 nike

我正在尝试在弹出窗口中重现可导航 View 的 iTunes 11 行为。不过,我似乎找不到一种方法让我的动画在弹出窗口的 contentSize 更改发生的同时发生。

我的基本设置是一个自定义 View 子类 MyPopoverNavigationView,它有两个 subview :我希望弹出窗口在旧 View 和新 View 之间导航。弹出窗口的 contentViewController 有一个 MyPopoverNavigationView 实例作为其 View 。我这样做:

// Configure constraints how I want them to show the new popover view
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
[ctx setDuration:0.25];
[ctx setAllowsImplicitAnimation:YES];
[self layoutSubtreeIfNeeded];
} completionHandler:nil];

据我从自动布局 WWDC 2012 视频中得知,这是由于约束更改而对 View 帧进行动画更改的推荐方法。它有效,但动画分两个阶段发生:

  • 首先,弹出窗口的 contentSize 将发生变化,以适应我要移动到的新 View (在该 View 变得可见之前,因此它会部分遮挡现有内容) .
  • 其次, View 按照我的预期进行动画处理,从而满足我安装的约束系统。

从设置一些断点来看,-layoutSubtreeIfNeeded最终在弹出窗口上调用了一个名为_fromConstraintsSetWindowFrame:的私有(private)方法,该方法在我的动画组之外执行弹出窗口大小动画。我的上下文的持续时间不受尊重,并且在弹出窗口的大小更改完成之前我的动画不会发生。

如何让我的 View 随着弹出框大小的变化而动画化?

最佳答案

事实证明,技巧是在动画和完成 block 的外部显式设置弹出窗口的contentSize属性。相关片段来自 sample GitHub project我把它放在一起弄清楚看起来像:

// Configure constraints for post-navigation view layout
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
[ctx setDuration:0.25];
[ctx setAllowsImplicitAnimation:YES];
[self layoutSubtreeIfNeeded];
} completionHandler:^{
// Tear down some leftover constraints from before the transition
}];

// Explicitly set popover's contentSize so its animation happens simultaneously
containingPopover.contentSize = postTransitionView.frame.size;

关于cocoa - 动画自动布局更改与 NSPopover contentSize 更改同时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14783711/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com