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();
そして関数を図に呼び出す過程で
drawRectを自分で呼び出して再描画しないでください.
最後に、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ファイルに次の関数を追加します.
次はview controllerの関数です
自分で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を関連付けることを覚えておくと効果があります.画像は次回追加します.