iOS Gesture Recognizer 简单使用

来源:互联网 发布:有人收购淘宝店铺干嘛 编辑:程序博客网 时间:2024/06/05 06:40

本文将会利用上篇教程【如何在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


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

原创粉丝点击