Nikon工程实现及代码总结:
这个工程各个模块功能相对简单些,所以花费的时间也不是很多;使用较多的也就是延时显示、点击放大、简单动画和视频播放了,最感兴趣的也就那个翻页效果了,蛮不错的样子。 下面就小总结一下工程中用到的一些小技巧之类的:
1、本工程大量使用动画效果,在此我们使用UIView animation;也有不少设计到NSTimer,不过据说NSTimer不是很好用,一不小心就给挂了,又或者到该停的时候没有停止继续运行而导致Bad Access。其实是要在适当的时候给它invalidate掉,这样暂时没什么问题了。 再有就是当退出该页面的时候至少得invalidate一次,不然它就一直在运行着,不知道在某个时候就给挂了。。切记
在invalidate的时候可以进行适当的判断,这样既可以保证释放,也不过度释放。 如下:
if ([scrollTimer isValid] == YES) { [scrollTimer invalidate]; scrollTimer = nil; }
2、先来说说随时间逐个出现视图的使用:这个我是使用了NSTimer,将需要出现的视图先添加到页面上,给每个视图标记tag值,将全部的视图alpha值设置为0,即隐藏该试图,随后调用NSTimer每隔一段时间触发相应成员方法,该方法则根据tag值逐个将其alpha值置为1.0。
(1)类似下面用法:
showImageTimer = [NSTimerscheduledTimerWithTimeInterval:0.5target:selfselector:@selector(showImagesByTime) userInfo:nilrepeats:YES]; //每隔0.5秒触发showImagesByTime事件,在该事件中逐个显示,同时可以添加相应动画是变化变得平缓 -(void)showImagesByTime{ UIView *temp = [self viewWithTag:(NSInteger)(imageLoadNumber+1000)] [UIViewbeginAnimations:nilcontext:nil]; [UIViewsetAnimationDuration:2.0]; [UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut]; temp.alpha = 1; [UIViewcommitAnimations]; } //最后得在适当的位置停用NSTimer: [showImageTimer invalidate];
(2)两张图片相继出现的代码:其实就是在一个动画结束之后开始另一个
[UIViewanimateWithDuration:0.5animations:^{ nikonimage1.alpha = 1; } completion:^(BOOL finish){ [UIViewanimateWithDuration:0.5animations:^{ nikonimage2.alpha = 1; }completion:^(BOOL finish){ isfinish = YES; }]; }];
3、scrollView自动滑动,类似跑马灯效果。不过刚开始时要求自由滑动,当手指触摸到开始滑动时便停止自动滑动,或则滑动到最左边时停止。 我们这里用了NSTimer每隔0.03秒触发scrollAutomatic事件,在scrollAutomatic中进行判断是否停止NSTimer,scrollAutomatic中通过设置contentOffset让其活动。同时在ScrollVIew的委托scrollViewWillBeginDragging中停止NSTimer。scrollViewWillBeginDragging在拖动开始的时候触发的委托。
scrollTimer = [NSTimerscheduledTimerWithTimeInterval:0.03target:selfselector:@selector(scrollAutomatic) userInfo:nilrepeats:YES];//设置为NO的时候不会循环 scrollTime = 0; -(void)scrollAutomatic{ scrollTime ++; imageScrollView.contentOffset = CGPointMake(scrollTime, 0); if (scrollTime >= imageScrollView.contentSize.width -1024) { if ([scrollTimer isValid] == YES) { [scrollTimer invalidate]; //这步很重要 scrollTimer = nil; } } } #pragma mark - UIScrollViewDelegate - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { //开始拖动的时候停止自动滚动 if ([scrollTimer isValid] == YES) { [scrollTimer invalidate]; //这步很重要 scrollTimer = nil; } }
4、同一物品变换颜色:这个其实很简单,准备足够不同颜色的图片,每按一个按钮替换一张图片
解决方案:上面图片为一张UIImageView视图,为每种颜色设置一个按钮,对应相应tag值,点击按钮时根据tag值更改imageview的图片(先将图片alpha值设置为0,而后重新设置为1可有闪动效果)
if(button.tag<2000) { nikonImage1.alpha = 0; [nikonImage1setImage:[UIImageimageNamed:[NSStringstringWithFormat:@"camera_1_%d.jpg",button.tag-1000]]]; [UIViewanimateWithDuration:0.5animations:^{ nikonImage1.alpha = 1; } ]; }
5、CMPopTipView的使用:使用到了第三方库,我们代码里也就这些用法够了
定义: UIImageView *popImage; /** < 弹出框*/ popImage = [[UIImageViewalloc]init]; [selfaddSubview:popImage]; [popImagesetImage:[UIImageimageNamed:[NSStringstringWithFormat:@"nikon_2_pop_0%d",button.tag-1000]]]; //设置图片 [popImage setFrame:CGRectMake(0, 665, 1024, 60.5)];//设置坐标
6、视频播放,使用的MPMoviePlayerController
-(void)openMovie:(id)sender { NSString *path = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"m4v"]; MPMoviePlayerController *movieController = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:path]]; //设置要播放的视频的位置 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:movieController]; //设置视频播放结束后的回调处理 [movieController play]; //播放视频 } -(void)movieFinish:(NSNotification*)notification { MPMoviePlayerController *movieController = [notification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:movieController]; [movieController release]; //释放资源 movieController = nil; } //同时可以 [movieController stop];停止
用法参考: http://c.gzl.name/archives/tag/mpmovieplayercontroller
http://www.cnblogs.com/KidReborn/archive/2010/10/07/1845097.html
7、点击图片放大到全屏,如果图片和按钮同属于一个类,直接addSubView上去的话无法遮蔽后面的button,点击button所在的位置仍能触发按钮的相关事件。
解决方法:
1:先添加一个View视图到该页面上,视图大小设为全屏(能遮蔽按钮位置),然后再添加图片。 可以在一开始时就添加view,将其隐藏,点击图片放大的时候再给其显示,推出时又隐藏即可。
2:新建一个视图View点击放大时跳转到一个新的界面,
类似:Nokon03VideoView *videoView = [[Nokon03VideoViewalloc] initWithFrame:VIDEOBUTTONFRAME];
videoView.backgroundColor=[UIColorwhiteColor];
[self addSubview:videoView];
3:在放大的时候把button的userInteractionEnabled值设为NO,使button不可点击,之后重新设YES
4:放大时把Image的userInteractionEnabled值设为YES,之后重新设NO.
ps:点击放大时想要遮住背景,可先添加一个纯白或其他颜色View,而后再添加该图片
8、本工程用到的页面跳转效果的代码:
在AppDelegate继承UIResponder,然后写一个类进行相关操作,并重写UIResponder的三个委托:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
根据其原始坐标和移动后坐标进行判断,然后结合动画便可产生本工程页面跳转的效果。所有界面都继承该类。具体的到时回顾源代码好了。
9、点击弹出和隐藏目录:
解决办法:将目录定于屏幕以外坐标,根据适当判断选择弹出或隐藏目录,使用改变frame即可;
每个页面都标记有tag值,选择目录某个页面时移除当前页面,加载新页面。
思路即是如此,不过实现起来稍微有点复杂,具体回顾下源代码的类ContentsView好了。
PS:小技巧
1.当button很多,或则图片很多的时候,可以充分利用array,这种时候总很有效。
2.添加到同一视图上时要注意先后顺序,弄不好就与视图被遮蔽无法显示。
[self sendSubviewToBack:nikonimage];
[self bringSubviewToFront:iconImage];
或许可以适当调整下视图位置,这两个使用时都得先
[self addSubview:bigImageView];
下才行,不过还是一开始就注意的好。
3.移除当前试图的所有子试图
4.使所有按钮处于为选中状态(和Array一起用)
//移除当前试图的所有子试图 -(void)remooveAllSubview { for (UIView *subView in self.subviews) { [subView removeFromSuperview]; } } //使所有按钮处于为选中状态(和Array一起用) -(void)closeAllButton{ for(int i = 0;i < 8 ;i ++) { UIButton *button = [buttonArray objectAtIndex:i]; if(button.selected == YES) { button.selected = NO; break; } } }
5.延迟2s触发:
[selfperformSelector:@selector(dismissArrow) withObject:nilafterDelay:2];
6.读取plist文件的代码:(内有一个dictionary)
NSString *path = [[NSBundlemainBundle] pathForResource:@"config"ofType:@"plist"]; NSDictionary *dic = [NSDictionarydictionaryWithContentsOfFile:path];