如果在 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 = 1sliderValueDidChange 会按预期工作。


更新代码:

这行不通。

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,这样它会在第一个动画完成后立即开始。