2013-03-27 57 views
2

我有一個非常簡單的(很希望非常簡單)的問題。在Objective-C中,你如何在兩點之間繪製一條線並將其添加到UIView?我已用一個UIImageView和操縱其Transform屬性試過,但最終用下面的代碼時,轉動線爲正方形或長方形:在UIView上畫一個5像素線

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

我有兩個CGPoints,startend,我會喜歡在兩點之間畫一條動態的5px線,並將其添加到我的子視圖。

BK:

start是的地步用戶開始觸摸屏幕,點end是用戶的手指是目前點。顯然這在遊戲過程中會發生很大的變化。我需要能夠移動這條線來連接這兩點。

我正在使用touchesBegan:, Moved:, and Ended:方法來創建,移動和銷燬該行。

CoreGraphics中

我有以下代碼;我該如何添加這條線到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:當我初始化視圖只叫...

Draw方法在UIViewController中:

- (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]; 
+1

的形狀,你可以多放點與addLineToPoint:方法和完成使用 closePath方法你有沒有考慮過Core Graphics,使用UIView的'draw:'方法? – bgoers 2013-03-27 20:39:09

+0

如果我使用繪製方法,我將如何跟蹤線條?我需要能夠移動它,調整它的大小,並根據需要銷燬它。 – David 2013-03-27 20:41:10

+1

那麼在你移動的事件中,你可以更新一個屬性/變量來跟蹤當前位置。每次更新都會調用'draw:'方法,因此您只需在開始和當前之間繪製一個點,並刪除所有舊線。清除是非常簡單的,因爲這裏概述 - > http://stackoverflow.com/a/7907669/1415949 – bgoers 2013-03-27 20:43:15

回答

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);   
} 

這會在你的UIView頂部繪製一個黑色1px的線自定義繪圖。

如果您需要更新線你可以只使用了一些性能,如

@property (nonatomic) CGPoint startPoint; 

,併爲制定者自定義實現像

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

做那,你希望每個屬性控制並使您的drawRect:使用此類屬性進行繪圖。

+0

沒有必要保存和恢復上下文--UIView已經建立了一個上下文:[* ... UIKit創建並配置繪圖的圖形上下文並調整該上下文的轉換,以便它的原點與您的原點匹配視圖的邊界矩形。*](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/drawRect :) – Caleb 2013-03-27 20:55:54

+0

I知道,但它並沒有傷害,它使得一切都整潔,如果你正在執行其他自定義繪圖之後;) – 2013-03-27 21:06:33

+0

好吧,我添加了這個作爲自定義的UIView,並實現了設置終點(而不是起點)的方法,但drawRect:在添加視圖後未被調用。 – David 2013-03-27 21:23:49

0

你可以這樣

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 

創建和UIBezierPath如果你想創建

我希望幫你