如果在 viewDidLoad 中将 Alpha 设置为 0 然后淡入,则 UISlider 不会被选中
UISlider Does Not Get Selected If Alpha is set 0 in viewDidLoad and Then Fades In
我以编程方式在我的视图中添加了一个 UISlider。此外,为 sliderValueDidChange
添加了观察滑块变化的功能。
var durationSlider: UISlider!
override func viewDidLoad() {
super.viewDidLoad()
durationSlider = UISlider(frame:CGRectMake(0, 600, self.view.bounds.width, 20))
durationSlider.minimumValue = 0
durationSlider.maximumValue = 100
durationSlider.continuous = true
// durationSlider.alpha = 0
durationSlider.tintColor = UIColor.redColor()
durationSlider.value = 0
durationSlider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)
self.view.addSubview(durationSlider)
}
func sliderValueDidChange(sender:UISlider!) {
print("value--\(sender.value)")
}
直到这里,一切都像魅力一样,我在 UISlider 上完美地获得了价值变化。
但是,一旦我添加 durationSlider.alpha = 0
,并在我的 viewDidLoad()
中使用类似这样的内容:
viewDidLoad() {
...
let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTapGestureRecognizer:")
tapGestureRecognizer.numberOfTapsRequired = 1
self.player.view.addGestureRecognizer(tapGestureRecognizer)
}
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(1, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 1.0
}, completion: nil)
UIView.animateWithDuration(1.0, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 0
}, completion: nil)
}
此时,我有两个问题。
1) UISlider 立即淡入(没有任何持续时间或延迟,就好像我直接使用 alpha = 1
- 没有使用 animateWithDuration),而它很好地淡出。
2) 如果我在 viewDidLoad 中使用 alpha = 0
,UISlider 不会触发 sliderValueDidChange
。但是,如果我尝试 alpha = 1
,sliderValueDidChange
会按预期工作。
更新代码:
这行不通。
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(0.2, delay: 0.4, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
}, completion: {completed in
UIView.animateWithDuration(2.0, delay: 2.0, options: [], animations: {
self.durationSlider.alpha = 0
}, completion: nil)
})
}
但是,这有效:
UIView.animateWithDuration(0.2, delay: 0.4, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
}, completion: nil)
我想要实现的是一个带有 UISlider 的视频持续时间控制器,所以我想在用户点击屏幕时显示它,使其可以进行交互,并且如果用户不进行交互 x秒,隐藏。
我认为这是预期的行为。 Alpha 0 意味着用户看不到它,因此不会与之交互。我看到了类似的posthere。也请尝试链接动画。
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(1, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 1.0
}, completion: { completed in
UIView.animateWithDuration(1.0, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 0
}, completion: nil)
}
}
如果我没记错的话,当 alpha < 0.5 时控件会被禁用。
您的动画代码有误。您有两个具有相同持续时间和相同延迟的动画。他们同时运行,这是错误的。您需要这样做,以便第二个使用延迟,该延迟是延迟和前一个动画持续时间的总和。 (所以如果第一个动画的延迟为1,持续时间为1.5,你想给第二个动画延迟1.0 + 1.5 = 2.5,所以它在第一个动画结束后立即开始。
或者,您可以将第二个动画放在第一个动画的完成块中,延迟为 0,这样它会在第一个动画完成后立即开始。
我以编程方式在我的视图中添加了一个 UISlider。此外,为 sliderValueDidChange
添加了观察滑块变化的功能。
var durationSlider: UISlider!
override func viewDidLoad() {
super.viewDidLoad()
durationSlider = UISlider(frame:CGRectMake(0, 600, self.view.bounds.width, 20))
durationSlider.minimumValue = 0
durationSlider.maximumValue = 100
durationSlider.continuous = true
// durationSlider.alpha = 0
durationSlider.tintColor = UIColor.redColor()
durationSlider.value = 0
durationSlider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)
self.view.addSubview(durationSlider)
}
func sliderValueDidChange(sender:UISlider!) {
print("value--\(sender.value)")
}
直到这里,一切都像魅力一样,我在 UISlider 上完美地获得了价值变化。
但是,一旦我添加 durationSlider.alpha = 0
,并在我的 viewDidLoad()
中使用类似这样的内容:
viewDidLoad() {
...
let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTapGestureRecognizer:")
tapGestureRecognizer.numberOfTapsRequired = 1
self.player.view.addGestureRecognizer(tapGestureRecognizer)
}
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(1, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 1.0
}, completion: nil)
UIView.animateWithDuration(1.0, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 0
}, completion: nil)
}
此时,我有两个问题。
1) UISlider 立即淡入(没有任何持续时间或延迟,就好像我直接使用 alpha = 1
- 没有使用 animateWithDuration),而它很好地淡出。
2) 如果我在 viewDidLoad 中使用 alpha = 0
,UISlider 不会触发 sliderValueDidChange
。但是,如果我尝试 alpha = 1
,sliderValueDidChange
会按预期工作。
更新代码:
这行不通。
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(0.2, delay: 0.4, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
}, completion: {completed in
UIView.animateWithDuration(2.0, delay: 2.0, options: [], animations: {
self.durationSlider.alpha = 0
}, completion: nil)
})
}
但是,这有效:
UIView.animateWithDuration(0.2, delay: 0.4, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
}, completion: nil)
我想要实现的是一个带有 UISlider 的视频持续时间控制器,所以我想在用户点击屏幕时显示它,使其可以进行交互,并且如果用户不进行交互 x秒,隐藏。
我认为这是预期的行为。 Alpha 0 意味着用户看不到它,因此不会与之交互。我看到了类似的posthere。也请尝试链接动画。
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(1, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 1.0
}, completion: { completed in
UIView.animateWithDuration(1.0, delay: 1.5, options: [], animations: {
self.durationSlider.alpha = 0
}, completion: nil)
}
}
如果我没记错的话,当 alpha < 0.5 时控件会被禁用。
您的动画代码有误。您有两个具有相同持续时间和相同延迟的动画。他们同时运行,这是错误的。您需要这样做,以便第二个使用延迟,该延迟是延迟和前一个动画持续时间的总和。 (所以如果第一个动画的延迟为1,持续时间为1.5,你想给第二个动画延迟1.0 + 1.5 = 2.5,所以它在第一个动画结束后立即开始。
或者,您可以将第二个动画放在第一个动画的完成块中,延迟为 0,这样它会在第一个动画完成后立即开始。