2010-04-10 3 views
38

Tôi có UIImageView được phân lớp và cố gắng ghi đè drawRect để tôi có thể vẽ trên đầu hình ảnh bằng cách sử dụng Quartz 2D. Tôi biết đây là một câu hỏi mới, nhưng tôi không thấy những gì tôi đã làm sai. Dưới đây là giao diện:drawRect không được gọi trong lớp con của UIImageView

#import <UIKit/UIKit.h> 

@interface UIImageViewCustom : UIImageView { 

} 
- (void)drawRect:(CGRect)rect; 
@end 

Và việc thực hiện:

#import "UIImageViewCustom.h" 

@implementation UIImageViewCustom 

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

- (void)drawRect:(CGRect)rect { 
    // do stuff 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

tôi đặt một breakpoint trên drawRect và nó không bao giờ chạm, dẫn tôi nghĩ rằng nó không bao giờ được gọi là gì cả. Không phải là nó được gọi là khi lượt xem đầu tiên tải? Tôi đã ghi đè không chính xác?

+0

vui lòng xem câu trả lời được cập nhật, xin lỗi vì đã làm phiền bạn lần nữa. –

+0

okies. Tôi đã xem nó sẽ hoạt động nếu bạn tạo một lớp con của UIView thay vì UIIMageView, bây giờ bạn có thể thêm các thuộc tính của UIImageView vào lớp con của bạn, tôi đã làm nó một lần để vẽ nền của các ô xem bảng của tôi, để biết thêm chi tiết bạn có thể kiểm tra tại.http: //stackoverflow.com/questions/1784827/draw-a-custom-cell-for-tableview-uitableview-with-changed-colors-and-separa –

Trả lời

80

Nó sẽ chỉ được gọi nếu chế độ xem hiển thị và bị bẩn. Có lẽ vấn đề là trong mã tạo ra khung nhìn, hoặc trong Nib của bạn, nếu đó là cách bạn tạo ra nó?

Bạn cũng đôi khi sẽ thấy các điểm ngắt không được đặt đúng cách nếu bạn đang cố gỡ lỗi bản dựng "Bản phát hành".


Tôi bằng cách nào đó đã bỏ lỡ lần đầu tiên bạn đang phân lớp UIImageView. Từ các tài liệu:

cân nhắc đặc biệt

Lớp UIImageView được tối ưu hóa để vẽ hình ảnh của mình cho màn hình. UIImageView sẽ không gọi drawRect: trong một lớp con . Nếu lớp con của bạn cần mã vẽ tùy chỉnh, bạn nên sử dụng bạn sử dụng UIView làm lớp cơ sở.

Vì vậy, bạn đã có nó. Với việc dễ dàng vẽ hình ảnh vào chế độ xem của bạn bằng cách sử dụng [UIImage drawInRect:] hoặc bằng cách sử dụng CALayer, có thể không có lý do chính đáng để phân lớp UIImageView.

+0

không nên drawRect được gọi khi lần đầu tiên xem kết xuất, mặc dù? –

+0

Thực ra, bây giờ bạn nhắc đến nó, tôi nhớ đã đọc nó. Không biết tại sao tôi không thể tìm thấy nó một lần nữa khi tôi đang tìm kiếm nó. Cảm ơn. –

+1

'UIImageView' là một điều tuyệt vời để có thể phân lớp nếu bạn muốn làm việc với IB. Sigh ... cảm ơn câu trả lời, nó giúp. –

0

Không trả lời trực tiếp câu hỏi của bạn, nhưng có thể giải quyết được sự cố của bạn:

Tại sao điều này với lớp con của UIImageView? Phân lớp con luôn có thể có vấn đề, đặc biệt là đối với các lớp không được thiết kế để được phân lớp - và tôi đặt cược UIImageView thì không. Nếu bạn chỉ muốn vẽ nội dung trên đầu hình ảnh, sau đó tạo chế độ xem có nền trong suốt, vẽ bất kỳ thứ gì bạn muốn và đặt trực tiếp lên hình ảnh.

+1

OK, tốt, tôi đã tìm kiếm nó trong tài liệu và rõ ràng là phân lớp nó là tốt. Tôi vẫn nghi ngờ đây không phải là cách tốt nhất để hoàn thành mục tiêu. – jasoncrawford

1

Cố gắng thêm

Edit:

- (id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     [self setClearsContextBeforeDrawing:YES];//add this line also 
    } 
    return self; 
} 


- (void)setNeedsDisplay{ 
    [self setNeedsDisplayInRect:self.frame]; 
} 

vào mã của bạn.

hy vọng điều này sẽ hữu ích.

Cảm ơn,

madhup

+0

Cảm ơn bạn đã đề xuất, nhưng điều đó không có tác dụng :-( –

+0

cập nhật không hoạt động. –

+0

clearsContextBeforeDrawing is YES theo mặc định! – daveoncode

-1

Tôi đoán UIImageView không thể sử dụng để ghi đè drawRect

0

Tùy thuộc vào trường hợp cụ thể của bạn, nó có thể làm cho tinh thần để sử dụng một UIButton với một hình ảnh nền thay vì một UIImageView.Bạn thậm chí có thể đặt userInteractionEnabled thành NO và kết quả sẽ không thể phân biệt được với UIImageView.

Trong trường hợp này UIButton lớp con của bạn sẽ chỉ đơn giản bao gồm:

- (void)drawRect:(CGRect)rect 
{ 
    if (kSomethingSpecial) { 
    [self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"] 
        forState:UIControlStateNormal]; 
    } 
} 

Disclaimer - Tôi chỉ muốn giới thiệu này nếu bạn có kế hoạch để sử dụng hình ảnh như một nút ít nhất một số thời điểm đó. Tôi không thể hoàn toàn xác nhận bằng cách sử dụng UIButton như một giải pháp cho hành vi drawRect này trong UIImageView, vì tôi chắc chắn Apple có lý do để viết API của họ theo cách này, như Mark được tham chiếu.