ios - 如果在 viewDidLoad 中将 Alpha 设置为 0 然后淡入,则 UISlider 不会被选中

标签 ios swift uiviewanimation

我以编程方式在我的 View 中添加了一个 UISlider。此外,添加了 sliderValueDidChange 函数以观察 slider 的变化。

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 上的值(value)变化。


但是,只要我添加 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 的视频持续时间 Controller ,所以我想在用户点击屏幕时显示它,使其可以进行交互,如果用户在 x 秒内没有交互,隐藏它。

最佳答案

如果我没记错的话,当 alpha < 0.5 时控件会被禁用。

您的动画代码有误。您有两个具有相同持续时间和相同延迟的动画。它们同时运行,这是错误的。您需要这样做,以便第二个使用延迟,该延迟是延迟和前一个动画持续时间的总和。 (因此,如果第一个动画的延迟为 1,持续时间为 1.5,则您要为第二个动画设置 1.0 + 1.5 = 2.5 的延迟,因此它会在第一个动画结束后立即开始。

或者,您可以将第二个动画放在第一个动画的完成 block 中,延迟为 0,这样它会在第一个动画完成后立即开始。

关于ios - 如果在 viewDidLoad 中将 Alpha 设置为 0 然后淡入,则 UISlider 不会被选中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34445735/

相关文章:

ios - Swift NSAttributedString 修剪

ios - 实现 `backgroundColor` 的 `UIView` 的动画 `drawRect`

ios - Swift 实例成员问题

ios - URLForUbiquityContainerIdentifier 总是返回 nil

ios - 如何在单元格中启用 Google map 按钮?

ios - Xcode 本地化 Main.strings 文件具有多个具有相同上下文的字符串。将所有内容链接到一个主字符串?

ios - animatewithduration在iOS 8中不起作用

ios - swift : show subview with animation on click of button

iphone - 在不需要的 View 中触发替代景观

iphone - 当数据对象符合 NSCoding 时,UITableView 不显示新条目