关闭

iOS移动View点击事件

标签: ios移动uiviewcontroller移动中的View 点击
752人阅读 评论(1) 收藏 举报
分类:

在做开发的时候发现移动中的view不能点击,在网上找了很久之后自己写了一个移动的view点击事件,希望对大家有帮助废话不多说,直接开始。


新建工程,先删除文件中的ViewController.h和ViewController.m文件,新建MoveViewController继承于UIViewController

将MoveViewController作为window的根视图控制器,代码如下


在AppDelegate.m文件导入头文件

#import "MoveViewController.h"

接着在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}

函数中添加如下代码,并且在Info.plist文件中将Main storyboard file base name关键字段的Main删除

 MoveViewController *moveViewVc = [[MoveViewController alloc]init];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:moveViewVc];
    _window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _window.rootViewController = nav;
    [_window makeKeyAndVisible];



现在根视图控制变成MoveViewController,然后就可以在MoveViewController中进行操作了

在这之前我们需要先封装一个移动视图

新建文件继承于UIView

moveView.h文件代码如下:

//
//  moveView.h
//  ZQMoveViewClick
//
//  Created by 赵前 on 16/6/1.
//  Copyright © 2016年 赵前. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface moveView : UIView

/**
 移动视图的头部视图
 */
@property(nonatomic, strong)UIImageView *imageView;

/**
 移动视图的文字
 */
@property(nonatomic, strong)UILabel *labelView;

@end
moveView.m文件代码:

//
//  moveView.m
//  ZQMoveViewClick
//
//  Created by 赵前 on 16/6/1.
//  Copyright © 2016年 赵前. All rights reserved.
//

#import "moveView.h"

@implementation moveView


- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor grayColor];
        [self AddSubViews];
    }
    return self;
}

#pragma mark *** Private Method ***
- (void)AddSubViews{
    [self addSubview:self.imageView];
    [self addSubview:self.labelView];
}


#pragma mark *** Lazy Loading ***
- (UIImageView *)imageView{
    if (!_imageView) {
        _imageView  = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.bounds.size.width*0.6, self.bounds.size.height*0.6)];
        _imageView.center = CGPointMake(self.bounds.size.width/2, 5 + _imageView.bounds.size.height/2);
        _imageView.backgroundColor = [UIColor greenColor];
    }
    return _imageView;
}
- (UILabel *)labelView{
    if (!_labelView) {
        _labelView = [[UILabel alloc]initWithFrame:CGRectMake(0, 0,self.bounds.size.width*0.3, self.bounds.size.height*0.3)];
        _labelView.center = CGPointMake(self.bounds.size.width/2, CGRectGetMaxY(_imageView.frame) + 5 + _labelView.bounds.size.height/2);
        _labelView.text = @"test";
        _labelView.backgroundColor = [UIColor orangeColor];
    }
    return _labelView;
}

@end



视图封装好了之后,就可以在MoveViewController操作了。

MoveViewController.h文件代码如下:

//
//  MoveViewController.h
//  ZQMoveViewClick
//
//  Created by 赵前 on 16/6/1.
//  Copyright © 2016年 赵前. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MoveViewController : UIViewController

/**
 moveViewCount  创建的要移动的视图数量
 */
-(void)CreateMoveView;

@end
MoveViewController.m代码如下

//
//  MoveViewController.m
//  ZQMoveViewClick
//
//  Created by 赵前 on 16/6/1.
//  Copyright © 2016年 赵前. All rights reserved.
//

#import "MoveViewController.h"
#import "moveView.h"
#define WIDTH [UIScreen mainScreen].bounds.size.width
#define HEIGHT [UIScreen mainScreen].bounds.size.height
#define Tag 100
@interface MoveViewController ()
{
    NSTimer *_timer;/**< 设置气泡滚动开始时间*/
    NSArray *_dataSource;
}

@end

@implementation MoveViewController
- (void)initializeDataSource{
    _dataSource = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];
}

-(void)CreateMoveView{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(respondsToGesture:)];
    _timer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(respondsToTimer:) userInfo:nil repeats:YES];
    int wid = WIDTH - 100;
    int hei = HEIGHT - 124;
    for (int i = 0; i < _dataSource.count; i++) {
        CGFloat w = (arc4random() % wid + 0);
        CGFloat h = (arc4random() % hei + 0);
        moveView *bubble = [[moveView alloc]initWithFrame:CGRectMake(0, 0, 100, 80)];
        bubble.userInteractionEnabled = YES;
        bubble.center = CGPointMake(w, h);
        bubble.tag = Tag + i;
        bubble.layer.anchorPoint = CGPointMake(0, 0);
        [bubble.layer setBackgroundColor:[UIColor clearColor].CGColor];
        [self.view.layer addSublayer:bubble.layer];
        [self.view addGestureRecognizer:tap];
        [self.view addSubview:bubble];
    }
}


#pragma mark *** Events ***
-(void)respondsToGesture:(UITapGestureRecognizer *)gesture {
//    ShowInfoViewController *showInfoVc = [ShowInfoViewController new];
    CGPoint touchPoint = [gesture locationInView:self.view];
    for (int i = (int)_dataSource.count; i >=0; i--) {
        UIView *temView = [self.view viewWithTag:(Tag + i)];
        if ([temView.layer.presentationLayer hitTest:touchPoint]) {
            temView.backgroundColor = [UIColor blueColor];
//            [self.navigationController pushViewController:showInfoVc animated:YES];
            return;
        }
    }
}

-(void)viewWillAppear:(BOOL)animated
{
    [_timer setFireDate:[NSDate distantPast]];
}

-(void)viewDidDisappear:(BOOL)animated
{
    [_timer setFireDate:[NSDate distantFuture]];
}

-(void)respondsToTimer:(NSTimer *)timer
{
    int wid = WIDTH - 100;
    int hei = HEIGHT - 124;
    for (int i = 0; i < (int)_dataSource.count; i++) {
        CGFloat w = (arc4random() % wid + 0);
        CGFloat h = (arc4random() % hei + 0);
        CGPoint poi = CGPointMake(w, h);
        CAKeyframeAnimation *moveLayerAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
        UIView *temView = [self.view viewWithTag:(Tag + i)];
        moveLayerAnimation.values = @[[NSValue valueWithCGPoint:temView.center],
                                      [NSValue valueWithCGPoint:poi]];
        temView.center = poi;
        
        moveLayerAnimation.duration = 20;
        moveLayerAnimation.autoreverses = YES;
        moveLayerAnimation.repeatCount = INFINITY;
        moveLayerAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        [temView.layer addAnimation:moveLayerAnimation forKey:@"move"];
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initializeDataSource];
    self.view.backgroundColor = [UIColor whiteColor];
    [self CreateMoveView];
}

@end

到此,就可以看见点击的效果了。

注意:这个代码只是简单的做出了效果,可以进行更好的封装实现,宏定义的Tag值是为了判断当前点击的是哪个View,以便进行取值,或者跳转到下一个界面的时候知道是点击的哪个view。

另外说明的一点是可以根据视图的层级点击(比如某个视图被一个视图遮住了,点击的时候只有在最上面的视图才会发生颜色的变化),如果点击之后要进一步操作,可以在下面函数中写

-(void)respondsToGesture:(UITapGestureRecognizer *)gesture {
//    ShowInfoViewController *showInfoVc = [ShowInfoViewController new];
    CGPoint touchPoint = [gesture locationInView:self.view];
    for (int i = (int)_dataSource.count; i >=0; i--) {
        UIView *temView = [self.view viewWithTag:(Tag + i)];
        if ([temView.layer.presentationLayer hitTest:touchPoint]) {
            temView.backgroundColor = [UIColor blueColor];
//            [self.navigationController pushViewController:showInfoVc animated:YES];
            //可以在这里写你想要做的事情
            return;
        }
    }
}

效果图如下:

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11628次
    • 积分:293
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论