2010-10-01 32 views
14

Tôi muốn hiển thị rất nhiều hình ảnh trong ô bảng. Tôi biết hai phương pháp để hiển thị một hình ảnh.sự khác nhau giữa UIImageView và drawInRect là gì?

Một là tạo ra một ví dụ để UIImageView và hiển thị nó

CGRect rect=CGRectMake(x,y,width,height); 
UIImageView *image=[[UIImageView alloc]initWithFrame:rect]; 
[image setImage:[UIImage imageNamed:@"sample.jpg"]]; 

phương pháp khác là,

CGRect rect=CGRectMake(x,y,width,height); 
[[UIImage imageNamed:@"sample.jpg"] drawInRect:rect]; 

Bây giờ, câu hỏi của tôi là, sự khác biệt giữa hai là gì? Cái nào hiệu quả? Hoặc chức năng someother có sẵn tốt hơn này?

Cảm ơn trước ....

Trả lời

33

Sử dụng phương pháp drawInRect: có CoreGraphics vẽ hình ảnh vào hoạt động CGContext bằng cách sử dụng CPU. Giả sử bạn đang sử dụng phương thức UIView 's drawRect:, điều này sẽ vẽ hình ảnh vào bộ đệm của khung nhìn.

UIImageView sử dụng hình ảnh được gán cho nó làm đệm sao lưu thay vì sử dụng chậm hơn drawRect:. GPU sau đó tham chiếu bộ đệm này trực tiếp khi màn hình được tổng hợp qua QuartzCore.

+0

+1 cho câu trả lời tuyệt vời. Tôi đã cố gắng để có được đầu của tôi xung quanh sự khác biệt giữa hai người trong một thời bây giờ. Vì vậy, 'UIImageView' luôn luôn là con đường để đi, sau đó? Có những trường hợp mà 'drawRect:' 'ing trực tiếp hình ảnh là thích hợp hơn không? –

+0

Tình huống duy nhất tôi có thể thấy nó chậm hơn là khi tổng hợp một cảnh nền tĩnh từ nhiều hình ảnh nhỏ và sau đó làm động nội dung trên đầu trang mà không thay đổi nền. Trong trường hợp đó, GPU sẽ phải bố trí lại cả nội dung chuyển động trên đầu và toàn cảnh nền mỗi khung hình. Đây là một trường hợp góc của khóa học. – rpetrich

+3

Một tình huống mà '-drawRect:' là một lợi thế là khi bạn muốn hiệu suất cuộn mượt mà và bạn có PNG có độ trong suốt. Trên phần cứng cũ hơn, GPU không thể xử lý cuộn toàn bộ khung nhìn trong suốt cùng lúc mà không làm rơi khung hình. Một cách xung quanh việc này là thực hiện tất cả các tính năng tổng hợp của bạn trong '-drawRect:', công cụ này chuyển đổi công việc GPU nặng này thành một công việc CPU nặng một lần. Đây là một kịch bản tương đối phổ biến trong các ô xem bảng đồ họa dữ dội, mặc dù nó không phải là vấn đề lớn với iPhone 4 và iPad do các GPU nhanh hơn. –

0

UIImageView là một lớp con UIView. Bằng cách thêm nó vào phân cấp khung nhìn, bạn sẽ có được tất cả các lợi ích miễn phí: hình động, kích thước tài sản, transoforms affine, vv Plus, bạn có thể thay đổi cơ bản UIImage bất cứ lúc nào bạn muốn.

Mặt khác, gọi drawInRect: sẽ chỉ vẽ hình ảnh nơi bạn nói, nhưng không tương tác với phân cấp UIView, do đó bạn không nhận được bất kỳ lợi ích nào từ việc có nó trên phân cấp khung nhìn.

Tôi nghĩ rằng (chưa thử), việc vẽ hình ảnh trực tiếp nhanh hơn, nhưng tôi nghĩ rằng trong hầu hết các trường hợp có UIImageView là một ý tưởng tốt hơn.

+0

Rất kỳ quặc, vẽ hình ảnh chậm hơn vì nó ít trực tiếp hơn việc gán nó cho 'UIImageView' – rpetrich

+0

Thật tuyệt vời khi biết, cảm ơn bạn! – pgb

+0

Cảm ơn câu trả lời có giá trị của bạn –

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