- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个用 animateWithDuration 和 setAnimationRepeatCount()
动画的脉冲矩形。
我正在尝试在同步“点击”的动画 block 中添加声音效果。但音效只播放一次。我在任何地方都找不到任何提示。
UIView.animateWithDuration(0.5,
delay: 0,
options: UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.Repeat,
animations: {
UIView.setAnimationRepeatCount(4)
self.audioPlayer.play()
self.img_MotronomLight.alpha = 0.1
}, completion: nil)
音效应该播放四次但没有播放。
音频实现:
//global:
var metronomClickSample = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("metronomeClick", ofType: "mp3")!)
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
audioPlayer = AVAudioPlayer(contentsOfURL: metronomClickSample, error: nil)
audioPlayer.prepareToPlay()
....
}
@IBAction func act_toggleStartTapped(sender: AnyObject) {
....
UIView.animateWithDuration(....
animations: {
UIView.setAnimationRepeatCount(4)
self.audioPlayer.play()
self.img_MotronomLight.alpha = 0.1
}, completion: nil)
}
最佳答案
提供 UIViewAnimationOptions.Repeat
选项不会导致重复调用动画 block 。动画在 CoreAnimation
级别上重复。如果您在动画 block 中放置一个断点,您会注意到它只执行一次。
如果您希望动画与声音一起循环执行,请创建一个重复的 NSTimer
并从那里调用动画/声音。请记住,计时器将保留目标,因此不要忘记使计时器无效以防止保留循环。
编辑:在下面添加了实现
首先,我们需要创建计时器,假设我们有一个名为 timer
的实例变量。这可以在 View 的 viewDidLoad:
或 init
方法中完成。初始化后,我们安排运行循环执行,否则它不会重复触发。
self.timesFired = 0
self.timer = NSTimer(timeInterval: 0.5, target: self, selector:"timerDidFire:", userInfo: nil, repeats: true)
if let timer = self.timer {
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
}
以下是计时器每隔一段时间(在本例中为 0.5 秒)触发的方法。在这里,您可以运行动画和音频播放。请注意,UIViewAnimationOptions.Repeat
选项已被删除,因为计时器现在负责处理重复的动画和音频。如果您只让计时器触发特定次数,您可以添加一个实例变量来跟踪触发次数,并在计数超过阈值时使计时器无效。
func timerDidFire(timer: NSTimer) {
/*
* If limited number of repeats is required
* and assuming there's an instance variable
* called `timesFired`
*/
if self.timesFired > 5 {
if let timer = self.timer {
timer.invalidate()
}
self.timer = nil
return
}
++self.timesFired
self.audioPlayer.play()
var options = UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.CurveEaseOut;
UIView.animateWithDuration(0.5, delay: 0, options: options, animations: {
self.img_MotronomLight.alpha = 0.1
}, completion: nil)
}
关于ios - animateWithDuration 播放声音不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32214676/
我正在使用这些(代码块 1 和 2)将带有动画的 UIScrollView 从开始移动到我的结束点(x:0 到 1000,在这个例子中) 代码块 1: UIScrollView.animateWith
-(void)fadeLabel{ UILabel *label = (UILabel *)[self.view viewWithTag:kLabelTag]; [UIView ani
我正在使用 animateWithDuration 让我的 UIVIew 之一无休止地旋转。现在,我需要获取 UIView 在特定时间旋转的当前值。我尝试使用以下功能: -(float)getCurr
我在 viewController 中有一个循环动画 - (void)moveAnimating { [UIView animateWithDuration:2.0f animations:^
出于某种原因,如果我只使用代码: [UIView animateWithDuration:.5 delay:0 options:UIViewAn
我正在学习 Swift,但在从不同函数移动 UIView 时遇到问题。如果我使用这个: View Controller : let boardView = BoardView() @IBAction
let downFrame = CGRect(x: 0, y: ScreenSize.height, width: ScreenSize.width, height: ScreenSize.heigh
我试图让“luke”跳过一个物体以确保游戏不会结束,他确实这样做了,但即使他避开了物体,游戏仍然会结束,就好像 luke 在游戏过程中没有离开他原来的位置一样动画。 我在 -(void)touches
我在 UIViewController 中使用此方法来显示一条消息三秒钟,然后淡出。 mainMessageLabel 是在接口(interface)文件中声明的 UILabel。 - (void)
我正在尝试对三个 UILabel(display1、display2、display3)进行交叉溶解,方法是使用 block 动画淡出、更改文本,然后一次淡入一个。我使用的代码是: [UIView a
今天 animateWithDuration 表现得很愚蠢,我不知道为什么。我检查了所有的东西,所有的括号,一切都很完美,但它总是呈现我没有指定为动画的代码行。 好的,这就是重点。我有一个 longP
我有一个没有自动布局的 ViewController,我正在尝试为一些按钮设置动画。我在 ViewDidAppear 中有一些 UIView animateWithDuration 代码,那里的一切都
我想在我的标签上先淡出然后淡入,我可以让两者分开工作但不能一起工作。 [UILabel animateWithDuration:1.0 animations:^{ _swixV
我正在尝试运行示例来测试此功能。我在 Storyboard中有一个标签和一个按钮,我在 View Controller 中引用了标签的底部约束。当我使用按钮时,我希望标签随动画一起移动,但它在没有动画
我有一个用 animateWithDuration 和 setAnimationRepeatCount() 动画的脉冲矩形。 我正在尝试在同步“点击”的动画 block 中添加声音效果。但音效只播放一
我在 switch 语句中有一段动画,该语句运行并执行预期的操作。在计时器内每二十秒成功调用一次动画。但是,动画不会在任何时候发生,而是在第一次发生。在我下面的代码中,您将看到我用来尝试突出显示问题的
我正在尝试将 JSSAlertView ( github.com/stakes/JSSAlertView ) 与 Swift 2.0 一起使用,但出现错误: Cannot invoke animate
我在我的 ScrollView 委托(delegate)方法 scrollViewDidEndDragging 中执行了一个简单的动画。 看起来像这样: - (void)scrollViewDidEn
我有一个 CollectionView,我想在用户选择的 CollectionViewCell 中创建一个动画。我选择使用 animateKeyframesWithDuration 是因为我想逐步创建
在执行 UIView.animateWithDuration 时,我想定义一条自定义曲线以方便使用,而不是默认曲线:.CurveEaseInOut、.CurveEaseIn、.CurveEaseOut
我是一名优秀的程序员,十分优秀!