iOS开发项目总结
#webview开发过程中踩到的坑;
1.webview关闭时关闭音频声音的问题;
一开始采取的时候采取@”about:blank”的方式关闭,发现在出现webview跳转后goback回来的时候加载之前的空白页,所以这个方法有局限性;
2.采用与JS交互的方法;
在页面关闭之前,直接调用JS关闭视频播放的方法,实现音频播放的关闭;
3.webview同时加载两个URl会报错,即一个页面的URL未加载完成又开始加载另外一个页面的URL,这时候webview就会报错;
#音频播放控制的问题
1.音频循环播放的问题;
通过监听音频播放完成的动作,将音频的播放回拨到开始的地方;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidPlayToEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
-(void)rerunPlayVideo{
if (!self.player) {
return;
}
CGFloat a=0;
NSInteger dragedSeconds = floorf(a);
CMTime dragedCMTime = CMTimeMake(dragedSeconds, 1);
[self.player seekToTime:dragedCMTime];
[self.player pause];
}
#倒计时结束的控制问题
1.通过GCD的方式控制倒计时;
通过计时器倒计时音频的控制,但需要处理在倒计时结束前对其它事件的处理,防止页面已经进入到其它页面了计时器还没有释放,这样常常会出现奔溃;
– (void)createTimer {
//设置倒计时时间
//__block 如果修饰指针时,指针相当于弱引用,指针对指向的对象不产生引用计数的影响
__block int timeout = 60;
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, global);
// 设置触发的间隔时间
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
//1.0 * NSEC_PER_SEC 代表设置定时器触发的时间间隔为1s
//0 * NSEC_PER_SEC 代表时间允许的误差是 0s
//block内部 如果对当前对象的强引用属性修改 应该使用__weak typeof(self)weakSelf 修饰 避免循环调用
WS(ws);
//设置定时器的触发事件
dispatch_source_set_event_handler(timer, ^{
//1. 每调用一次 时间-1s
timeout –;
if (timeout < 0) {
dispatch_source_cancel(timer);
//MRC下需要释放,这里不需要
// dispatch_realse(timer);
//在主线程中对button进行修改操作
dispatch_async(dispatch_get_main_queue(), ^{
}else {
//处于正在倒计时,在主线程中刷新button上的title,时间-1秒
dispatch_async(dispatch_get_main_queue(), ^{
});
}
});
dispatch_resume(timer);
}
#属性字体设置字体的间隔
1.通过NSKernAttributeName这个方法设置属性字体的间隔;
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:allStr];
[attStr addAttribute:NSKernAttributeName value:@9.2 range:[allStr rangeOfString:content]];