UISwitch - 检测动画结束

时间:2014-10-02 07:29:13

标签: ios ios8 uiswitch

我的UISwitch位于UITableViewCell内。我为切换分配了目标操作:

[switch addTarget:self action:@selector(changeSwitchColor:) forControlEvents:UIControlEventValueChanged];

- (void)changeSwitchColor:(id)sender
{
    ...
}

问题是在动画完成之前调用了changeSwitchColor:,但我想检测动画何时完成,所以我可以在不破坏动画的情况下设置thumbTintColor属性。

我尝试使用UIView setAnimationDidStopSelector:方法检测动画:

[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    ...
}

UISwitch完成动画时没有调用此方法(我甚至不确定动画是如何在内部制作的)。

如何检测UISwitch的完成状态?

谢谢!

2 个答案:

答案 0 :(得分:6)

您可以使用CATransaction.setCompletionBlock(_:)

addTarget(self, action: #selector(valueChanged(sender:)), for: [.valueChanged])

@objc private func valueChanged(sender: UISwitch) {
    CATransaction.setCompletionBlock { [onChange] in
        onChange?(sender.isOn)
    }
}

文档说即使没有动画或动画被删除,也可以保证调用该块。它使用起来非常安全。

答案 1 :(得分:0)

Tomáš使用 Swift 4 回答:

settingsSwitch.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged)

@objc func valueChanged(_ sender: UISwitch) {
    CATransaction.setCompletionBlock {
        //... animation just finished
    }
}