iOSのUIViewについてのメモ


DemoについてUIViewのいくつかの関連操作をした後、メモを書きます.
自分で1つのVIEWをstoryboardに追加して、右下のobject liabraryの中で雪の中でviewを見てからview controllerに追加して、その前に、まず自分のクラスを作成して、UIViewと継承して、このクラスで新しく追加したVIEWの操作を処理します.このクラスを作成し、新しいVIEWを追加した後、右上隅でこの新しいVIEWのクラスを新しく作成したクラス(本明細書ではFaceView)に設定し、FaceViewクラスでこの新しいビューに関する操作を処理することができます.
今回の操作は主に次の3つの部分で構成されており、1つ目は笑顔を描き、2つ目は左右の回転をサポートするときに形状を再描画することができ、3つ目はpinch(収縮)操作をサポートし、2本の指で拡大縮小図形を制御する.
(一)、笑顔を描く
簡単な笑顔は大きな円で、中には小さな円が2つあり、目として、曲線を口として追加します.
絵を描くときは、まず現在のコンテキストを取得することに注意してください.
   CGContextRef context = UIGraphicsGetCurrentContext();
そして関数を図に呼び出す過程で
-(void)drawCircleAtPoint:(CGPoint)p withRadius:(CGFloat)radius inContext:(CGContextRef)context {
    UIGraphicsPushContext(context);
    CGContextBeginPath(context);
    CGContextAddArc(context,p.x,p.y,radius,0,2*M_PI,YES);
    CGContextStrokePath(context);
    UIGraphicsPopContext();
}
微笑みの曲線を描き、curveで描き、2つの制御頂点を設定します
	//draw the mouth
	CPoint mouthStart;
	mouthStart.x = midPoint.x - MOUTH_X_SCALE*size;
	mouthStart.y = midPoint.y + MOUTH_Y_SCALE*size;
	
	CPoint mouthEnd = mouthStart;
	mouthEnd.x += MOUTH_X_SCALE*size*2;
	
	//the two control points
	CPoint mouthCP1 = mouthStart;
	mouthCP1.x += MOUTH_X_SCALE * size * 2/3;
	CPoint mouthCP2 = mouthEnd;
	mouthCP2.x -= MOUTH_X_SCALE * size * 2/3;
	
	float smile = 1.0;
	
	CGFloat smileOffset = 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);
次にcontrollerに次の関数を追加して、回転操作に応答します.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
	return YES;
}
は、次の関数を追加してグラフィックを再描画し、呼び出します. setNeedsDisplayこの関数はグラフィックの再描画を実現し、drawRect関数を自動的に呼び出してグラフィックを再描画します.覚えておいてください.
drawRectを自分で呼び出して再描画しないでください.
@synthesize scale = _scale;

#define DEFAULT_SCALE 0.90

-(CGFloat)scale
{
	if(!_scale)
		return DEFAULT_SCALE;
	else
		retuen _scale;
}

-(void)SetScale:(CGFloat)scale
{
	if(_scale != scale)
	{
	//redraw the view when the scale change
		_scale = scale;
		[self setNeedsDisplay];
	}
}
-(void)setup
{
	self.contentMode = UIViewContentModeRedraw;
}

//             nib   (“nib” NeXT        )。
//        ,            nib      。
-(void)awakeFromNib
{
	[self setup];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       [self setup];
    }
    return self;
}
以上のコードはview controllerの前の関数の使用に合わせて、回転時の図形の再描画を実現することができます.
最後に、2つの指で拡大・縮小する操作を実現します.
Gestures are recognized by the class UIGestureRecognizer
This class is “abstract.”  We only actually use “concrete subclasses” of it. There are two sides to using a gesture recognizer 1. Adding a gesture recognizer  to a  UIView  to ask it to recognize that gesture. 2. Providing the implementation of  a method to “handle” that gesture when it happens.
Usually #1 is done by a Controller Though occasionally a UIView  will do it to itself if it just doesn’t make sense without that gesture. Usually #2 is provided by the  UIView  itself But it would not be unreasonable for the Controller to do it. Or for the Controller to decide it wants to handle a gesture differently than the view does.
faceviewファイルに次の関数を追加します.
-(void)pinch:(UIPinchGestureRecognizer *)gesture
{
	if((gesture.state == UIGestureRecognizerStateChanged) ||
		(gesture.state == UIGestureRecongnizerStateEnded))
	{
		self.scale *= gesture.scale;
		gesture.scale = 1;
	}
}
この動作に対する応答、すなわち上記の第2のステップであり、ここではgestureのscaleに基づいて原図をスケーリングする
次はview controllerの関数です
-(void)setFaceView:(FaceView *)faceView
{
	_faceView = faceView;
	[self.faceView addGestureRecongnizer:[[UIPinchGestureRecongnizer alloc] initithTarget:self.faceView action:@selector(pinch:)]];
}
もちろん絵の関数drawRect関数にscaleを関連付けることを覚えておくと効果があります.画像は次回追加します.