UIView 重绘与多点触控事件处理

UIView除了负责界面的处理外,同事也继承了UIResponder这个类。所以它也必须要处理一些常见的事件,例如界面的重绘以及多点触控事件的处理。

1.重绘事件的处理

- (void) drawRect:(CGRect) rect;

一般来说,我们不需要重载UIView的drawRect:的方法。但是在某些情况下,例如要动态制作某些图形到UIView上面的适合,我们就可以在继承UIView 的类里面重载drawRect:方法。由于这个方法属于回调函数(callback),因此它会在界面重画时自动调用。如果要强迫iPhone重绘界面的适合,也请不要直接调用这个方法,而是通过 UIView 的setNeedsDisplay 来更新界面,或者是通过 setNeedsDisplayInRect: 来局部更新某个区域的界面。

2.多点触控事件处理

由于UIView 继承了 UIResponder,因此,我们可以直接在 UIView里面处理有关多点触控的事件。

-(void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event;
-(void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event;
-(void) touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event;

这三个方法会再触控到UIView 所属的区域时自动调用。不论使用几根手指触控,碰到屏幕的一开始,就会发送一词touchesBegan:withEvent:的消息,其中,touches表示不分先后顺序的多个触控点,event则为触控的事件,可以得到在这个触控事件内有几个点击数(tapCount);当按住界面移动的时候,touchesMoved:withEvent:的这个消息则会被发送出去,一直到放开手指后才回发送touchesEnded:withEvent:的消息,整个触控事件才算结束。

例如下面这段常用到得源代码

-(void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event{
    UITouch *touch = [touches anyObject];
    //或 UITouch *touch = [[touches allObjects] objectAtIndex:0];
    CGPoint location = [touch locationInView:self];  //取得触控点
    ...
    if([touch tapCount] == 2){   //若点击两下
    ...
    }
}

在一般情况下,我们只在乎用户的点击操作,通过NSSet里面anyObject 方法可以取得任一个触控点。相对的,如果很在意用户用了几个手指通过UITOuch 类的locationInView: 来取得触控点得位置,以及通过tapCount 来取得用户点击的次数

通过多点触控,我们做一个应用程序,这个应用程序是以人的3个手指来表示颜色中得R、G、B (红绿蓝)。第一个手指头表示R,第二个表示G,第三个表示B,也可以只使用一个或两个手指头来改变界面的颜色。

\\ViewController.m

-(void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *)event {
    int count = [touches count];
    switch (count){
    case 3:
        blueColor = (blueColor>1)?0:blueColor+0.05;
    case 2:
        greenColor = (greenColor>1)?0:greenColor+0.05;
    case 1:
        redColor = (redColor>1)?0:redColor+0.05;
    default:
        break;
    }
    self.view.backgroundColor = [UIColor colorWithRed:redColor
    green:greenColor
    blue:blueColor
    alpha:1.0]; 

其中,颜色值的部分是通过 UIColor这个类来产生的,通过RGBA来制定红绿蓝三种颜色以及 Alpha值,要注意,这三个颜色值范围是从0到1 而非255.

Xcode默认产生的 Storyboard里面的界面中得 Multiple touch 的选项是取消状态,只要勾选就可以接受多点触控了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值