如何使用动画更改NSButton的状态

时间:2015-01-15 11:38:33

标签: cocoa swift osx-yosemite

我正在尝试将复选框的状态绑定到模型中的变量。我希望在模型中相应的布尔属性发生更改时,使用标准Yosemite动画更新复选框的状态(就像单击它时一样)。 NSButton中是否有任何方法可以做到这一点?我正在寻找类似button.changeStateWithAnimation(NSOnState)的内容。

如果你不知道标准优胜美地动画"的含义,请务必查看this video

我尝试了什么

Cocoa绑定

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

没有Cocoa绑定

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

button.state = myStateProperty ? NSOnState : NSOffState

但这并没有触发动画。

我能让它发挥作用的唯一方法是致电NSButton&perform执行点击这样:

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

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

2 个答案:

答案 0 :(得分:2)

我尝试使用以下内容更改复选框的值:

checkbox.animator().setNextState()

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

所以,我认为国家根本不是一个可动画的财产。

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

答案 1 :(得分:0)

如何将这样的代码添加到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)”)         }         didSet         {             if resetAnimation == true {                 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个破发点开始第一次打印:

在更改状态前更改状态= 1并检查窗口时,选中了复选框。

在断点2处,申请表打印出来:

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

进一步传递产生了相同的预期结果。

我在这里发布了我的代码,以防您在此代码和代码之间看到有关如何实现此代码的一些区别。