【问题标题】:How to change an NSButton's state with animation如何用动画改变 NSButton 的状态
【发布时间】:2015-01-15 11:38:32
【问题描述】:

我正在尝试将复选框的状态绑定到模型中的变量。当我的模型中相应的布尔属性发生变化时,我想用标准的优胜美地动画(比如点击它时)更新复选框的状态。 NSButton 中是否有任何方法可以做到这一点?我正在寻找类似button.changeStateWithAnimation(NSOnState) 的东西。

如果您不知道“标准优胜美地动画”是什么意思,请务必查看this video

我尝试了什么

可可绑定

当我尝试将按钮的值绑定到我的布尔属性时,按钮会在模型更改但没有动画时更新。

没有 Cocoa 绑定

所以我尝试以编程方式切换按钮的状态。

button.state = myStateProperty ? NSOnState : NSOffState

但这也不会触发动画。

我可以让它工作的唯一方法是像这样调用 NSButton 的 performClick:

let currentButtonState = button.state == NSOnState
if currentButtonState != myStateProperty {
    button.performClick(self)
}

但我认为这不是正确的做法。是吗?

【问题讨论】:

  • 我怀疑performClick() 是你最好的选择,但你可以试试button.animator.state = myStateProperty ? NSOnState : NSOffState
  • 您好,感谢您的动画师建议,我刚刚尝试过button.animator().state = state ? NSOnState : NSOffState,但没有成功。请注意,我必须在animator 之后写(),因为它是一种方法。

标签: cocoa swift osx-yosemite


【解决方案1】:

我尝试使用以下方法更改复选框的值:

checkbox.animator().setNextState()

复选框在选中/取消选中之间翻转就好了,但没有任何动画。

所以,我认为状态根本不是可动画的属性。

您的performClick() 解决方法可能是这里唯一可行的方法。

【讨论】:

    【解决方案2】:

    如何将这样的代码添加到您的 Bool 变量声明中:

    var checkBoxFlag:Bool = false
    {
        didSet
        {
            if checkBoxFlag == true {myButton.state = NSOnState}
            if checkBoxFlag == false {myButton.state = NSOffState}
            myButton.display()
        }
    }
    

    只要 checkBoxFlag 的值发生变化,就会执行 didSet 代码。

    实际上,您可以使用它做更多事情。例如,如果您有一个名为 resetAnimation 的 Bool:

    var resetAnimation:Bool = false
        {
        willSet(newResetAnimation)
        {
    

    ("resetAnimation 即将由 (resetAnimation) 改为 \(newResetAnimation)") } 设置 { 如果重置动画 == 真 { println("resetAnimation 设置为 (resetAnimation)") }别的{ println("resetAnimation 设置为 (resetAnimation)") } } }

    如果然后在你的代码中你写的其他地方:

    resetAnimation = true
    resetAnimation = false
    resetAnimation = true
    

    这将打印:

    resetAnimation 即将由 false 变为 true
    resetAnimation 设置为 true
    resetAnimation 即将由 true 改为 false
    resetAnimation 设置为 false
    resetAnimation 即将由 false 改为 true
    resetAnimation 设置为 true

    编辑 - 测试:

    所以这是测试场景。在应用程序中,我将此测试粘贴到我有一个带有控制器的状态窗口。该窗口有一个自定义进度指示器。我在状态窗口 .xib 文件中添加了一个无关的复选框,默认状态为 on。

    在我声明的状态窗口控制器中

    @IBOutlet var testCheckbox:NSButton! 
    

    并将 testCheckbox 连接到状态窗口中的无关复选框。

    然后在状态窗口控制器中我声明了一个实例变量:

    var checkBoxFlag:Bool = true
    {
        didSet
        {
            if checkBoxFlag == true {testCheckbox.state = NSOnState}
            if checkBoxFlag == false {testCheckbox.state = NSOffState}
            testCheckbox.display()
        }
    }
    

    在用于更新自定义进度指示器的状态窗口控制器函数中,代码是(注意断点):

    func updateStatusProgress(statusprogress:CGFloat)
    {
        println("In Update Status Before Change state = \(testCheckbox.state)");
        if checkBoxFlag == true // breakpoint 1 here
        {
            checkBoxFlag = false
        }else{
            checkBoxFlag = true
        }
        println("In Update Status After Change state = \(testCheckbox.state)");
        statusProgressIndicator.cgValue = statusprogress // Break point 2 here
        statusProgressIndicator.display()
    }
    

    在打印的断点 1 处启动第一遍:

    在 Update Status Before Change state = 1 并检查窗口时,复选框被选中。

    在断点 2 处打印的应用程序:

    在更改状态后更新状态 = 0 并检查窗口未选中复选框

    进一步通过产生了相同的预期结果。

    我在此处发布了我的代码,以防您发现此代码与您的代码之间关于其实现方式的一些差异。

    【讨论】:

    • 问题是设置 myButton.state 不会导致按钮动画。我知道我可以使用 didSet 和 willSet,我不知道的是 NSButton 上的方法通过动画改变其状态。
    • 好的,我添加了button.display(),但这仍然不会触发动画。
    • 嗯...这应该可行,但我会进行更多测试。
    • 它改变了按钮的状态,但没有动画
    • 我已编辑我的答案以提供有关我的测试的详细信息。
    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2021-07-30
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多