2012-03-31 27 views
9

Tôi là người mới bắt đầu trong lập trình iOS, vì vậy xin lỗi nếu câu hỏi của tôi là một câu hỏi ngu ngốc.Lớp con UIView: drawRect không được gọi là

Tôi đang cố gắng tạo ứng dụng thực hiện vẽ tùy chỉnh trên hình ảnh được tải.

Để làm điều đó, tôi phát hiện ra rằng giải pháp là để phân lớp UIView và chỉnh sửa phương pháp drawRect.

Tôi đã thực hiện điều đó trên mã sau đây kích hoạt trên IBAction được liên kết với một nút trong tệp bảng phân cảnh Bộ dựng giao diện.

UIImageView *image = [[UIImageView alloc] initWithImage: [UIImage imageNamed:  @"SampleImage.jpg"]]; 
image.frame = previewView.frame; 
[image setContentMode:UIViewContentModeScaleAspectFit];  

[previewView addSubview:image]; 

customView *aCustomView = [[customView alloc] initWithFrame: CGRectMake(image.bounds.origin.x, image.bounds.origin.y, image.bounds.size.width, image.bounds.size.height)]; 
[previewView addSubview:aCustomView]; 

customView là lớp con UIView mà tôi tạo ra, mà initdrawRect phương pháp được thiết lập như thế này:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"INITIALIZING"); 
    if (self) { 
     // Initialization code 
     [self setBackgroundColor:[UIColor clearColor]]; 
    } 
    return self; 
} 


- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    NSLog(@"DRAWING"); 

    CGContextClearRect(ctx, rect); 

    CGContextSetRGBFillColor(ctx, 0, 255, 0, 0.3); 
    CGContextFillEllipseInRect(ctx, rect); 

    CGContextSetRGBStrokeColor(ctx, 255, 0, 0, 1); 
    CGContextSetLineWidth(ctx, 2); 
    CGContextStrokeEllipseInRect(ctx, rect); 
} 

Vấn đề mà tôi có là không vẽ được thực hiện và trên NSLog Tôi có "INITIALIZING" tin nhắn, nhưng không phải là bản vẽ "BẢN V" ".

Vì vậy, về cơ bản nó làm cho initWithFrame, nhưng nó không gọi phương thức drawRect.

Bạn vui lòng cho tôi biết tôi đang làm gì sai?

Trả lời

5

Paolo,

Dưới đây là một vài điều bạn có thể thử:

  1. trong initWithFrame, kiểm tra xem biến frame chứa những gì bạn mong chờ nó: NSLog(@"Frame: %@", NSStringFromCGRect(frame));
  2. Hãy thử gọi [preview setNeedsDisplay]; sau khi thêm nó vào superview

Cuối cùng, tôi sẽ thay đổi

image.frame = previewView.frame;

với:

image.bounds = CGRectMake (0, 0, previewView.frame.size.width, previewView.frame.size.height);

+0

Cảm ơn, bằng cách đặt NSLog, tôi phát hiện có điều gì đó sai trong khi gọi phương thức drawRect. Bằng cách thêm [previewView setNeedDisplay], phương thức này được gọi nhưng không phải khi tôi mong đợi nó được thực hiện. Tôi có nghĩa là, bằng cách làm theo các bước mã thực hiện dòng [previewView setNeedDisplay] không làm cho bản vẽ tùy chỉnh xuất hiện, thay vào đó nó xuất hiện sau này theo một cách nào đó. Tôi muốn hiểu trong thời điểm nào phương thức drawRect được gọi nhưng dù sao vấn đề ban đầu đã được giải quyết, cảm ơn :) – Dobrodeveloper

13
  1. Đảm bảo lớp chế độ xem mới của bạn là phân lớp UIView chứ không phải UIImageView.
  2. Để đảm bảo chế độ xem mới hiển thị, bạn sẽ cần phải thực hiện [viewContainer addSubView:] để nhận drawRect được gọi.

Ref từ doc:

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: 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 UIView làm lớp cơ sở.

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

+0

bạn có thể đặt lớp tùy chỉnh ghi đè phép vẽ trực tiếp vào bộ mã hóa – Subhash

2

Có thể câu hỏi là khung aCustomView là (0,0,0,0).
Bạn có thể thử chuyển một tham số CGRect không đổi, như sau: CGRectMake(5, 5, 100, 100)。

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