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// 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
这里有源码可以下载参考。
- iOS Gesture Recognizer 简单使用
- Gesture Recognizer(添加手势)
- 调用xcode tap gesture recognizer
- [iOS diary] UIImageView,UILabel等加gesture recognizer不成功,神秘属性userInteractionEnabled
- Gesture Recognizer code and source files
- 手势识别功能(Gesture Recognizer)
- tap gesture recognizer关联到一image view笔记********
- Gesture简单实例
- iOS Gesture 手势
- Android Gesture 使用简介
- android的Gesture使用
- gesture-imageview.jar使用
- Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植7:Gesture Recognizer【手势识别】
- 好奇怪的问题! uitablecell中的uiimageview ,有的响应gesture recognizer,有的不响应
- 好奇怪的问题! uitablecell中的uiimageview ,有的响应gesture recognizer,有的不响应
- android Gesture 简单Demo 源码
- Kaggle实战-最简单的DIGIT RECOGNIZER
- Gesture
- 本机能访问,但是局域网其他机器不能访问网站网页
- hdu4542 搜索+打表
- kernel/wait.c
- chapter 8.8: canceled and suspended requests
- 【0】4.1 这不是愚人节
- iOS Gesture Recognizer 简单使用
- chapter 8.9:Adaptive Time-outs in UMDF
- chapter 8.10:self-managed I/O
- shell基本功
- chapter 9.1: I/O targets
- 工厂方法模式——Head First Design Patterns
- 2013030401整整一年了
- AWR中的指标说明
- 算是愚人节吗,写这里好了。