iOS Gesture Recognizer 简单使用

本文将会利用上篇教程【如何在iPhone上绘制出一个笑脸】,在原有的基础上加入【手势】进行放大缩小的功能。


由于代码比较简单,就不进行详细的说明,注释里已经很明白。红色字是添加更改的部分,主要是利用Obj-c的存取方法的特点进行设置值与重绘。


FaceView.h

//
//  FaceView.h
//  Happiness
//
//  Created by surfboy on 1/30/13.
//  Copyright (c) 2013 SurfBoy. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface FaceView : UIView

@property (nonatomic)CGFloat scale;

-(void)pinch:(UIPinchGestureRecognizer *)gesture;

@end

FaceView.m

//
//  FaceView.m
//  Happiness
//
//  Created by surfboy on 1/30/13.
//  Copyright (c) 2013 SurfBoy. All rights reserved.
//

#import "FaceView.h"

@implementation FaceView

@synthesize scale = _scale;

#define DEFAULT_SCALE 0.9

// 表情的比例
- (CGFloat)scale {
    
    // 没有初始化时,给默认值
    if(!_scale) {
        
        return DEFAULT_SCALE;
    }
    else {
        return _scale;
    }
}

// 当Scale值发生变化时,进行重绘
-(void)setScale:(CGFloat)scale {
    
    // 如何比例没有变,不进行重绘,节省资源
    if (scale != _scale) {
        _scale = scale;
        [self setNeedsDisplay];
    }

}


// 手势
-(void)pinch:(UIPinchGestureRecognizer *)gesture {
    
    // 发生变化时
    if ((gesture.state == UIGestureRecognizerStateChanged) ||
        (gesture.state == UIGestureRecognizerStateEnded)) {
        
        // 保存当前的比例值
        self.scale*= gesture.scale;
        gesture.scale = 1;
    }
    
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
            NSLog(@"initWithFrame");

        //[self setup];
    }
    return self;
}



- (void)awakeFromNib {
    
     NSLog(@"awakeFromNib");
    [self setup];
}

- (void)setup {
    
        NSLog(@"setup");

    self.contentMode = UIViewContentModeRedraw;

}


// 画圆
- (void)drawCircleAtPoint:(CGPoint)p withRadius:(CGFloat)radius inContext:(CGContextRef)context {
    
    // UIGraphicsPushContext UIGraphicsPopContext 保证不破坏调用程序的Context
    UIGraphicsPushContext(context);

    // 创建一个路径
    CGContextBeginPath(context);

    // 调用画圆的方法
    CGContextAddArc(context, p.x, p.y, radius, 0, 2*M_PI, YES);

    // 开始画路径
    CGContextStrokePath(context);

    // 弹出当前的Context
    UIGraphicsPopContext();
}




#define DEFAULT_EYE_RADIUS 0.1
#define DEFAULT_EYE_H 0.35
#define DEFAULT_EYE_V 0.35

#define DEFAULT_MOUTH_H 0.45
#define DEFAULT_MOUTH_V 0.45
#define DEFAULT_MOUTH_SMILE 0.3

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // 取得当前上下文
    CGContextRef context = UIGraphicsGetCurrentContext();

    // 计算出屏幕中心的点x,y
    CGPoint midPoint;
    midPoint.x = self.bounds.origin.x + self.bounds.size.width / 2;
    midPoint.y = self.bounds.origin.y + self.bounds.size.height /2;
    
    // 计算出圆的半径,为了留点边距 * DEFAULT_SCALE
    CGFloat size = self.bounds.size.width /2;

    // 旋转屏幕的时高与宽对调
    if (self.bounds.size.height < self.bounds.size.width) size = self.bounds.size.height / 2;

    // 按比例缩小,留出边距
    size *= self.scale;

    // 设置线的宽
    CGContextSetLineWidth(context, 5.0);

    // 颜色
    [[UIColor blueColor] setStroke];
    
    // 开始画圆
    [self drawCircleAtPoint:midPoint withRadius:size inContext:context];
    
    // *开始画第一只眼睛,定位主要靠midPoint为基点
    CGPoint eyePoint;
    eyePoint.x = midPoint.x - size * DEFAULT_EYE_H;
    eyePoint.y = midPoint.y - size * DEFAULT_EYE_V;
    [self drawCircleAtPoint:eyePoint withRadius:size * DEFAULT_EYE_RADIUS inContext:context];
    
    // 第二只眼睛
    eyePoint.x += size * DEFAULT_EYE_H * 2;
    [self drawCircleAtPoint:eyePoint withRadius:size * DEFAULT_EYE_RADIUS inContext:context];
    
    // *开始画嘴,定义第一个点 // http://www.xushao.net/2013/01/31/3944 
    CGPoint mouthStart;
    mouthStart.x = midPoint.x - size * DEFAULT_MOUTH_H;
    mouthStart.y = midPoint.y + size * DEFAULT_MOUTH_V;
    
    // 结速的点
    CGPoint mouthEnd = mouthStart;
    mouthEnd.x += DEFAULT_MOUTH_V * size * 2;
    
    // Curve Point1
    CGPoint mouthCP1 = mouthStart;
    mouthCP1.x += DEFAULT_MOUTH_H *size * 2 / 3;
    
    // Curve Point2
    CGPoint mouthCP2 = mouthEnd;
    mouthCP2.x -= DEFAULT_MOUTH_H * size * 2 / 3;
    
    // 笑容指数
    float smile = 1;
    
    // DEFAULT_MOUTH_SMILE 越高,笑得越开
    CGFloat smileOffset = DEFAULT_MOUTH_SMILE * size * smile;
    mouthCP1.y += smileOffset;
    mouthCP2.y += smileOffset;
    
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, mouthStart.x, mouthStart.y);
    CGContextAddCurveToPoint(context, mouthCP1.x, mouthCP1.y, mouthCP2.x, mouthCP2.y, mouthEnd.x, mouthEnd.y);
    CGContextStrokePath(context);
    
}


@end


HappinessViewController.m

//
//  HappinessViewController.m
//  Happiness
//
//  Created by surfboy on 1/30/13.
//  Copyright (c) 2013 SurfBoy. All rights reserved.
//

#import "HappinessViewController.h"
#import "FaceView.h"

@interface HappinessViewController ()

@property (nonatomic,weak) IBOutlet FaceView *faceView;

@end

@implementation HappinessViewController

@synthesize happiness = _happiness;
@synthesize faceView = _faceView;

-(void)setHappiness:(int)happiness {
    
    _happiness = happiness;
    [self.faceView setNeedsDisplay];
}

// 在 Face view 中添加手势,这样才能响应
- (void)setFaceView:(FaceView *)faceView {
    
    _faceView = faceView;
    
    [self.faceView addGestureRecognizer:[[UIPinchGestureRecognizer alloc] initWithTarget:self.faceView action:@selector(pinch:)]];
}

#pragma mark -
#pragma mark Memory management

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
	
    [super viewDidLoad];

/*    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
	NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
	NSLog(@"%@",languages);*/
}

@end


这里有源码可以 下载参考。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值