我使用UISlider创建了一个视频持续时间行。它工作得很好;我可以改变滑块值。然后,我尝试向其添加视觉效果(淡入和淡出),因此当用户点击屏幕时,滑块会淡入,如果没有进行其他交互则淡出。
为了实现淡入&淡出效果,我在0-1之间调整了alpha。但是,ios显然不接受alpha 0.5下的元素的用户交互。因此,我无法使用普通animateWithDuration
实现这一点,因此我尝试添加一个计算秒数的计数器。
(更新: 显然,我想要实现的是,我有一个全屏视频,我想放置一个滑块来显示视频时间(当前时间+持续时间)。我想最初将滑块设置为不可见,当用户点击屏幕时,滑块变得可见。然后,用户在滑块上进行交互。但是,我想让滑块在最后一次点击后5秒后淡出)
我尝试了什么...
var durationSlider: UISlider!
var timer = NSTimer()
var counter = 0
override func viewDidLoad() {
super.viewDidLoad()
durationSlider.minimumValue = 0
durationSlider.maximumValue = 100
durationSlider.continuous = true
durationSlider.alpha = 0
durationSlider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)
self.view.addSubview(durationSlider)
let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTapGestureRecognizer:")
tapGestureRecognizer.numberOfTapsRequired = 1
self.player.view.addGestureRecognizer(tapGestureRecognizer)
}
func scheduledTimerWithTimeInterval(){
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounting"), userInfo: nil, repeats: true)
}
func updateCounting(){
counter = counter + 1
}
直到这里,一切正常,如果我只使用淡入,甚至不使用计数器,它就可以工作。
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
UIView.animateWithDuration(0.2, delay: 0.2, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
print("B")
}, completion: nil)
}
此处启动问题
如果我尝试在完成时使用淡出,它会直接进入完成闭包,因此它甚至不会给我一个与滑块交互的间隙(alpha <5)。
UIView.animateWithDuration(0.2, delay: 0.4, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
print("B")
}, completion: {completed in
UIView.animateWithDuration(2.0, delay: 10.0, options: [], animations: {
print("A")
self.durationSlider.alpha = 0
}, completion: nil)
})
当然,也尝试将它们分成两个独立的功能,但这会立即更改打印日志(所以alpha):
UIView.animateWithDuration(0.2, delay: 0.4, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
print("B")
}, completion: nil)
UIView.animateWithDuration(2.0, delay: 10.0, options: [], animations: {
print("A")
self.durationSlider.alpha = 0
}, completion: nil)
最后,设置一个计时器的想法突然出现在我脑海中,所以我尝试了这样的事情,但没有运气。它启动计数器并且它正在上升,但我认为这种逻辑在这里不起作用,因为如果有条件,它将永远不会进入。
func handleTapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
counter = 0
scheduledTimerWithTimeInterval()
UIView.animateWithDuration(0.2, delay: 0.2, options: [UIViewAnimationOptions.AllowUserInteraction], animations: {
self.durationSlider.alpha = 1.0
print("B")
}, completion: nil)
if counter > 6 {
UIView.animateWithDuration(2.0, delay: 5.0, options: [], animations: {
print("A")
self.durationSlider.alpha = 0
}, completion: nil)
}
实现我想要实现的目标的最佳方式是什么?适应淡入效果的正确方法是什么?在UISlider上启用用户交互的淡出?
答案 0 :(得分:1)
这些简单的步骤可以做到:
当用户点击以显示滑块时,设置一个五秒计时器(并为滑块的淡入设置动画,相当快,例如0.3秒)。 [一个不错的变化可能是淡入滑块并在动画的完成处理程序中启动计时器。]
在滑块的“值更改”操作上,使计时器无效/取消,并创建一个新的五秒计时器。 (如果用户从不更改滑块,则不会执行此步骤。但这很好;已经有一个计时器正在运行。)
无论如何,你都有一个计时器在运行,它最终会被激活(自你做淡入以来的五秒钟,或自用户上次更改滑块以来的五秒钟)。当计时器触发时,淡出滑块。全部完成!