iOS UISwitch的setOn(_:animated:)方法animated参数失效问题排查
问题原因与解决方案
你遇到的这个问题其实是因为调用setOn(_:animated:)的时机不对——当你还没把UISwitch添加到视图层级(也就是还没调用addSubview)的时候,这个方法的animated参数是不会生效的。系统在把控件首次添加到视图时,会默认播放一次动画来展示它的初始状态,不管你之前设置的animated是true还是false。
正确的做法:先添加到视图,再设置状态
你需要调整代码顺序,先把UISwitch添加到view上,再调用setOn(_:animated:)方法,这样animated参数才会起作用:
// 处理switch1 self.switch1 = UISwitch() self.switch1.frame = CGRect(x: 120, y: 150, width: 50, height: 30) self.view.addSubview(switch1) self.switch1.setOn(true, animated: true) // 先addSubview,再设置状态 // 处理switch2 self.switch2 = UISwitch() self.switch2.frame = CGRect(x: 120, y: 250, width: 50, height: 30) self.view.addSubview(switch2) self.switch2.setOn(true, animated: false) // 此时animated:false会生效,无动画
另一种更直接的方式:直接设置isOn属性
如果你只是想初始化UISwitch的状态,不需要动画,其实可以直接设置isOn属性,这个属性本身就是无动画的:
self.switch2 = UISwitch() self.switch2.frame = CGRect(x: 120, y: 250, width: 50, height: 30) self.switch2.isOn = true // 直接设置状态,无动画 self.view.addSubview(switch2)
补充说明
setOn(_:animated:)这个方法设计的初衷是在控件已经处于视图层级中时,修改它的状态并控制是否播放动画。如果在添加到视图前调用,系统还没有完成控件的布局渲染,所以动画参数会被忽略,而是用系统默认的初始展示动画。
内容的提问来源于stack exchange,提问作者mi kim
相关产品推荐
相关产品推荐

