我的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
的完成状态?
谢谢!
答案 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
}
}