首页 > 解决方案 > 使用 Swift,我如何为 NSSplitView 的 .setPosition() 方法设置动画,而不会在视觉上拉伸其内容?

问题描述

我想使用 .setPosition() 使用 Swift、Cocoa 和情节提要为 NSSplitViewItem 的外观制作动画。我的应用程序允许学生输入自然演绎证明。如果不正确,右侧会出现“建议视图”。如果正确,此建议视图将消失。

我正在使用的代码如下,第一个函数使“建议”出现,第二个函数使其消失:

  func showAdviceView() {

    // Our window
    let windowSize = view.window?.frame.size.width

    // A CGFloat proportion currently held as a constant
    let adviceViewProportion = BKPrefConstants.adviceWindowSize

    // Position is window size minus the proportion, since
    // origin is top left
    let newPosition = windowSize! - (windowSize! * adviceViewProportion)

    NSAnimationContext.runAnimationGroup { context in
        context.allowsImplicitAnimation = true
        context.duration = 0.75

        splitView.animator().setPosition(newPosition, ofDividerAt: 1)
    }

}

func hideAdviceView() {

    let windowSize = view.window?.frame.size.width
    let newPosition = windowSize!

    NSAnimationContext.runAnimationGroup{ context in
        context.allowsImplicitAnimation = true
        context.duration = 0.75

        splitView.animator().setPosition(newPosition, ofDividerAt: 1)

    }

}

我的问题是动画动作本身导致视图中的文本拉伸,如您在此示例中所见:当前行为

我真正想要的是文本本身保持所有比例并以我们在用户自己移动分隔符时看到的相同方式优雅地滑动:理想行为(但要以编程方式实现,而不是手动实现)

到目前为止,在我的故障排除过程中,我尝试在 NSAnimationContext 之外对其进行动画处理;在 XCode 中玩并发绘制和自动调整子视图;并大致研究了 Cocoa 的动画系统(虽然我读过的大部分内容似乎在这里没有直接应用,但我很可能会误解它)。我怀疑发生了什么是 .animator() 代理对象只允许 alpha 更改和拉伸---重绘以便在动画期间尊重文本对齐可能太不标准了。我的感觉是我需要“欺骗”应用程序将动画视为用户正在执行,但我不知道如何去做。

任何提示都非常感谢...

干杯

标签: swiftanimationcocoaappkit

解决方案


推荐阅读