2011-06-22 33 views
5

Đây là những gì tôi muốn làm:làm thế nào để vẽ UIBezierPaths

Tôi có một UIBezierPath và tôi muốn chuyển nó đến một số phương pháp để nó được rút ra. Hoặc đơn giản là vẽ nó từ phương thức mà nó được tạo ra.

Tôi không chắc chắn làm thế nào để chỉ ra xem nó nên được rút ra trong. Có phải tất cả các phương pháp để vẽ đã bắt đầu với

- (void)drawRect:(CGRect)rect { ...} ? 

tôi có thể làm

- (void)drawRect:(CGRect)rect withBezierPath:(UIBezierPath*) bezierPath { ... } ?? 

Làm thế nào để gọi hàm hoặc phương thức này, từ phương thức khác?

+0

Xem [Làm thế nào để vẽ một con đường Bézier trong một giao diện tùy chỉnh] (http://stackoverflow.com/a/34659468/3681880) cho một lời giải thích đầy đủ với một ví dụ. – Suragch

Trả lời

20

drawRect: là nội dung được gọi tự động khi bạn nhắn tin setNeedsDisplay hoặc setNeedsDisplayInRect: trên chế độ xem. Bạn không bao giờ gọi trực tiếp số drawRect:.

Tuy nhiên bạn có quyền nói rằng tất cả các thao tác vẽ được thực hiện trong phương thức drawRect:. thực hiện điển hình sẽ là,

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    /* Do your drawing on `context` */ 
} 

Vì bạn đang sử dụng UIBezierPath s, bạn sẽ cần phải duy trì một loạt các đường dẫn Bút chì mà bạn sẽ cần để vẽ và sau đó gọi setNeedsDisplay khi một cái gì đó thay đổi.

- (void)drawRect:(CGRect)rect {  
    for (UIBezierPath * path in bezierPaths) { 
     /* set stroke color and fill color for the path */ 
     [path fill]; 
     [path stroke]; 
    } 
} 

nơi bezierPaths là mảng UIBezierPath s.

+0

Tôi hiểu. trong đó một phần của mã tôi cần để tạo ra các mảng của UIBezierPaths? –

+0

Khai báo nó làm thuộc tính trong chế độ xem của bạn. –

+0

cảm ơn, điều này đã giúp vô cùng, và tôi đã hoàn thành công việc (sắp xếp cho bây giờ). –

3

Khi bạn cần để tùy chỉnh tầm nhìn của bạn, bạn có thể ghi đè lên -drawRect: trên lớp con:

- (void)drawRect:(CGRect)rect 
{ 
    // config your context 
    [bezierPath stroke]; 
} 

Edit: trực tiếp sử dụng -stroke làm cho mã nhỏ gọn hơn.

+1

Tò mò - bất kỳ lý do nào bạn sử dụng các phương pháp CoreGraphics thay vì chỉ là '- [UIBezierPath stroke]'? –

+0

@Ben: Cảm ơn, tôi nhớ điều đó. – cxa

+1

Bạn thậm chí không cần phải lấy bối cảnh nếu bạn định làm tất cả với UIKit. –

6

Đầu tiên, lưu đường dẫn của bạn trong một Ivar

@interface SomeView { 
    UIBezierPath * bezierPath; 
} 
@property(nonatomic,retain) UIBezierPath * bezierPath; 
... 
@end 
.... 
- (void)someMethod { 
    self.bezierPath = yourBezierPath; 
    [self setNeedsDisplayInRect:rectToRedraw]; 
} 

trong -drawRect:

- (void)drawRect:(CGRect)rect { 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(currentContext, 3.0); 
    CGContextSetLineCap(currentContext, kCGLineCapRound); 
    CGContextSetLineJoin(currentContext, kCGLineJoinRound); 
    CGContextBeginPath(currentContext); 
    CGContextAddPath(currentContext, bezierPath.CGPath); 
    CGContextDrawPath(currentContext, kCGPathStroke); 
} 
1

chỉ Vẽ xảy ra bên trong một phương pháp gọi là -drawRect: (được tự động gọi khi một cái nhìn được đánh dấu là cần hiển thị qua số setNeedsDisplay). Vì vậy, một phương pháp drawRect:withBezierPath: sẽ không bao giờ được gọi tự động. Cách duy nhất nó sẽ thực hiện là nếu bạn gọi nó là chính mình.

Một khi bạn có một UIBezierPath, tuy nhiên, nó rất dễ dàng để vẽ nó:

- (void)drawRect:(CGRect)rect { 
    UIBezierPath *path = ...; // get your bezier path, perhaps from an ivar? 
    [path stroke]; 
} 

Không cần để futz xung quanh với lõi đồ họa nếu tất cả các bạn muốn làm là vẽ một con đường.

+0

có vẻ như NSBezierPath không hoạt động trong iOS? Tôi đã thử, nhưng có lỗi. –

1

bạn có thể làm điều gì đó như sau. chỉ cần xác định một setStroke UIColor *; trong file .h và bạn cần phải thiết lập đối tượng strokeColor này trước khi bạn của bạn gọi [myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];

- (void)drawRect:(CGRect)rect 
    { 
     [strokeColor setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 
     for(UIBezierPath *_path in pathArray) 
      [myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
    } 

    #pragma mark - Touch Methods 
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     myPath=[[UIBezierPath alloc]init]; 
     myPath.lineWidth = currentSliderValue; 

     UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 
     [myPath moveToPoint:[mytouch locationInView:self]]; 
     [pathArray addObject:myPath]; 
    } 
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 
     [myPath addLineToPoint:[mytouch locationInView:self]]; 
     [self setNeedsDisplay]; 

    } 
Các vấn đề liên quan