2

非常に単純な(うまくいけば非常に単純な)質問があります。Objective-C では、どのように 2 点間に線を引き、それを UIView に追加しますか? UIImageView を使用してそのTransformプロパティを操作しようとしましたが、次のコードを使用すると、線が正方形または長方形に変わります。

[[self tline] setFrame:CGRectMake(start.x, start.y, width, 5)];
[[self tline] setTransform:CGAffineTransformMakeRotation(angle)];

私は 2 つの CGPoints と を持っておりstartend2 つの点の間に動的な 5px の線を描画し、それをサブビューに追加したいと考えています。

黒:

ポイントstartは、ユーザーが画面に触れ始めるポイントであり、ポイントendはユーザーの指が現在あるポイントです。明らかに、これはゲームプレイ中に大きく動きます。これらの 2 点を結ぶには、この線を移動できる必要があります。

メソッドを使用してtouchesBegan:, Moved:, and Ended:、ラインを作成、移動、および破棄しています。

コアグラフィックス

次のコードがあります。この行を に追加するにはどうすればよいself.viewですか?

CGContextRef c = UIGraphicsGetCurrentContext();
CGFloat color[4] = {1.0f, 1.0f, 1.0f, 0.6f};
CGContextSetStrokeColor(c, color);
CGContextBeginPath(c);
CGContextMoveToPoint(c, start.x, start.y);
CGContextAddLineToPoint(c, end.x, end.y);
CGContextSetLineWidth(c, 5);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextStrokePath(c);

カスタム UIView:

#import <UIKit/UIKit.h>

@interface DrawingView : UIView

@property (nonatomic) CGPoint start;
@property (nonatomic) CGPoint end;

- (void)drawRect:(CGRect)rect;

@end

#import "DrawingView.h"

@implementation DrawingView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetLineCap(context, kCGLineCapSquare);
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); //change color here
    CGFloat lineWidth = 5.0; //change line width here
    CGContextSetLineWidth(context, lineWidth);
    CGPoint startPoint = [self start];
    CGPoint endPoint = [self end];
    CGContextMoveToPoint(context, startPoint.x + lineWidth/2, startPoint.y + lineWidth/2);
    CGContextAddLineToPoint(context, endPoint.x + lineWidth/2, endPoint.y + lineWidth/2);
    CGContextStrokePath(context);
    CGContextRestoreGState(context);

    NSLog(@"%f",_end.x);
}

- (void)setEnd:(CGPoint)end
{
    _end = end;
    [self setNeedsDisplay];
}

@end

drawRect: ビューを初期化するときにのみ呼び出されます...

UIViewController の Draw メソッド:

- (void)drawTLine:(CGPoint)start withEndPoint:(CGPoint)end
{   
    [[self dview] setStart:start];
    [[self dview] setEnd:end];
    [[self dview] drawRect:[self dview].frame];
}

これは、描画ビューを追加する方法です。

DrawingView* dview = [[DrawingView alloc] initWithFrame:self.view.frame];
[dview setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:dview];
4

2 に答える 2

3

メソッドを使用してサブクラスUIView化し、カスタム描画を実行するdrawRect:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetLineCap(context, kCGLineCapSquare);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); //change color here
    CGFloat lineWidth = 1.0; //change line width here
    CGContextSetLineWidth(context, lineWidth); 
    CGPoint startPoint = rect.origin; //change start point here
    CGPoint endPoint = {.x = CGRectGetMaxX(rect), .y = startPoint.y} //change end point here
    CGContextMoveToPoint(context, startPoint.x + lineWidth/2, startPoint.y + lineWidth/2);
    CGContextAddLineToPoint(context, endPoint.x + lineWidth/2, endPoint.y + lineWidth/2);
    CGContextStrokePath(context);
    CGContextRestoreGState(context);        
}

これにより、 の上部に 1px の黒い線が描画されますUIView

行を更新する必要がある場合は、次のようないくつかのプロパティを使用できます

@property (nonatomic) CGPoint startPoint;

次のようなセッターのカスタム実装を提供します

- (void)setStartPoint:(CGPoint)point {
      _point = point;
      [self setNeedsDisplay]; // this will cause drawRect: to be called again
}

制御したいすべてのプロパティに対してこれを行い、drawRect:そのようなプロパティを描画に使用します。

于 2013-03-27T20:51:38.817 に答える
0

このようにUIBezierPathを作成できます

UIBezierPath path = [[UIBezierPath alloc] init]
[path moveToPoint: CGPoint(x,y)] // X and Y, start point
[path addLineToPoint:CGPoint(x2,y2) // X2 and Y2, end point

形状を作成したい場合は、方法でより多くのポイントを配置し、方法addLineToPoint:を使用して仕上げること ができますclosePath

お役に立てれば幸いです

于 2013-03-27T20:55:18.163 に答える