【问题标题】:UISwitch - detecting end of animationUISwitch - 检测动画结束
【发布时间】:2014-11-27 03:58:06
【问题描述】:

我有一个UISwitch,它位于UITableViewCell 的内部。我有一个分配给 switch 的目标操作:

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

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

问题是changeSwitchColor:在动画结束之前被调用,但我想检测动画何时结束,所以我可以设置thumbTintColor属性而不破坏动画。

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

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

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

但是UISwitch完成动画时不会调用此方法(我什至不确定动画是如何内部制作的)。

如何检测UISwitch的完成状态?

谢谢!

【问题讨论】:

  • 你可以从另一个stackoverflow答案链接找到你的答案:stackoverflow.com/questions/19628310/…
  • 这个问题究竟如何回答我的问题?
  • UISwitch 是一个不好的课程。很难覆盖或自定义。我认为您应该覆盖 UIControl 并进行自己的切换
  • 我真的很想避免自己切换,我当然知道UIControl

标签: ios ios8 uiswitch


【解决方案1】:

Tomáš 使用 Swift 4 回答:

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

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

【讨论】:

    【解决方案2】:

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

    addTarget(self, action: #selector(valueChanged(sender:)), for: [.valueChanged])
    
    @objc private func valueChanged(sender: UISwitch) {
        CATransaction.setCompletionBlock { [onChange] in
            onChange?(sender.isOn)
        }
    }
    

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

    【讨论】:

    • 对我不起作用:似乎只是直接运行而无需等待切换动画完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多