2009-06-09 29 views
7

Cố gắng tìm ra những gì tôi đang làm sai ở đây. Đã thử nhiều thứ, nhưng tôi chưa bao giờ thấy hình chữ nhật khó nắm bắt trên màn hình. Ngay bây giờ, đó là tất cả những gì tôi muốn làm - chỉ cần vẽ một hình chữ nhật duy nhất trên màn hình.Câu hỏi iphone mới bắt đầu: vẽ hình chữ nhật. Tôi đang làm gì sai?

Tôi nhận được "ngữ cảnh không hợp lệ" trên mọi thứ trừ CGContextSetRGBFillColor(). Nhận được bối cảnh sau đó có vẻ như sai với tôi, nhưng tôi không ở nhà nhìn vào những ví dụ tôi đã sử dụng tối qua.

Tôi cũng đã làm sai điều gì khác không? Tôi thực sự muốn có được ít nhất này nhiều làm tối nay ...

- (id)initWithCoder:(NSCoder *)coder 
{ 
    CGRect myRect; 
    CGPoint myPoint; 
    CGSize mySize; 
    CGContextRef context; 

    if((self = [super initWithCoder:coder])) { 
    NSLog(@"1"); 
    currentColor = [UIColor redColor]; 
    myPoint.x = (CGFloat)100; 
    myPoint.y = (CGFloat)100; 
    mySize.width = (CGFloat)50; 
    mySize.height = (CGFloat)50; 
    NSLog(@"2"); 
    // UIGraphicsPushContext (context); 
    NSLog(@"3"); 
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); 
    context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, currentColor.CGColor); 
    CGContextAddRect(context, myRect); 
    CGContextFillRect(context, myRect); 
    } 

    return self; 

} 

Cảm ơn,

Sean.

Trả lời

9

Bạn không được phép đặt mã CG trong initWithCoder. Thông điệp đó chỉ nên được sử dụng cho mục đích INITIALIZATION.

Đặt mã bản vẽ của bạn trong:

- (void)drawRect:(CGRect)rect 

Nếu bạn đang subclassing một UIView ...

+12

Ngoài ra, bạn không nên gọi trực tiếp drawRect, nhưng thay vào đó hãy gọi setNeedsDisplay, vì vậy hệ điều hành sẽ chọn nó và vẽ lại chế độ xem sau. – pgb

+0

Có. Đúng rồi. –

+0

Được rồi, vì vậy tôi không nên sử dụng initWithCoder() để vẽ nội dung. Nhưng điều đó có thực sự trả lời câu hỏi của tôi không? Việc chuyển mã CG sang một hàm khác sẽ tạo ra bất kỳ sự khác biệt nào trong việc hình chữ nhật có được vẽ không? Và đối với việc sử dụng/không sử dụng drawRect, bây giờ bạn đã quản lý để gây nhầm lẫn cho tôi. Bạn có nói rằng tôi nên đặt tất cả các tham số cho hình chữ nhật của tôi trong drawRect? Điều đó dường như không đúng, hoặc - nếu tôi muốn vẽ nhiều hơn một hình chữ nhật thì sao? Nếu có một ứng dụng ví dụ đơn giản ngoài đó * chỉ * vẽ hình chữ nhật hoặc hình tròn hoặc thứ gì đó, tôi muốn xem qua nó. Sean. –

40

Bắt đầu với một Xem mẫu dựa trên, tạo ra một dự án có tên Drawer. Thêm một lớp UIView vào dự án của bạn. Đặt tên cho nó là SquareView (.h và .m).

Nhấp đúp vào DrawerViewController.xib để mở nó trong Trình tạo giao diện. Thay đổi chế độ xem chung thành đó thành SquareView trong Trình kiểm tra nhận dạng (lệnh-4) bằng cách sử dụng menu bật lên Lớp. Lưu và quay lại Xcode.

Đặt mã này trong drawRect: phương pháp SquareView.m tập tin của bạn để vẽ một lớn, quanh co, hình chữ nhật trống màu vàng và một nhỏ, xanh lá cây, hình vuông trong suốt:

- (void)drawRect:(CGRect)rect; 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 0.0, 1.0); // yellow line 

    CGContextBeginPath(context); 

    CGContextMoveToPoint(context, 50.0, 50.0); //start point 
    CGContextAddLineToPoint(context, 250.0, 100.0); 
    CGContextAddLineToPoint(context, 250.0, 350.0); 
    CGContextAddLineToPoint(context, 50.0, 350.0); // end path 

    CGContextClosePath(context); // close path 

    CGContextSetLineWidth(context, 8.0); // this is set from now on until you explicitly change it 

    CGContextStrokePath(context); // do actual stroking 

    CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 0.5); // green color, half transparent 
    CGContextFillRect(context, CGRectMake(20.0, 250.0, 128.0, 128.0)); // a square at the bottom left-hand corner 
} 

Bạn không phải gọi phương thức này để bản vẽ xảy ra. Trình điều khiển chế độ xem của bạn sẽ cho phép chế độ xem tự vẽ ít nhất một lần khi chương trình khởi chạy và các tệp NIB được kích hoạt.

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