本文将会利用上篇教程【如何在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
这里有源码可以 下载参考。