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;
        }];
    }];

 

3scrollView自动滑动,类似跑马灯效果。不过刚开始时要求自由滑动,当手指触摸到开始滑动时便停止自动滑动,或则滑动到最左边时停止。  我们这里用了NSTimer每隔0.03秒触发scrollAutomatic事件,在scrollAutomatic中进行判断是否停止NSTimerscrollAutomatic中通过设置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];

 

 

 

 

 

 

 

posted @ 2012-11-01 15:59  小、  阅读(513)  评论(1编辑  收藏  举报