2011-12-20 43 views
21

Tôi có một UITableView khá vani trong ứng dụng của tôi được sử dụng để hiển thị hình ảnh và văn bản theo cách mặc định/tiêu chuẩn. Lần đầu tiên một UITableViewCell được yêu cầu tôi trả lại nó với một hình giữ chỗ và bắt đầu tải xuống không đồng bộ hình ảnh thực. Khi tải xuống hoàn tất, tôi thay thế hình ảnh trình giữ chỗ.UIImageView trong kích thước thay đổi UITableViewCell của tôi trên kích thước

Nếu tải xuống không thành công, hình ảnh trình giữ chỗ vẫn còn. Nhấp vào hàng như vậy sẽ hoạt động bình thường. Nếu quá trình tải xuống thành công, việc nhấp vào một hàng có hình ảnh dự định sẽ dẫn đến UIImageView mở rộng đến chiều cao của hàng (và chiều rộng tăng theo tỷ lệ). UIImageView không bao giờ trở lại kích thước bình thường. Các nỗ lực thô lỗ để đặt khung của UIImageView không làm giảm bớt vấn đề thay đổi kích thước bí ẩn.

// from my - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; method 
// after boilerplate cell dequeuing code 
cell.textLabel.text = [selectedNoun title]; 

// add placeholder image 
UIImage *placeholderImage = [UIImage imageNamed:@"placeholder.png"]; 
cell.imageView.image = placeholderImage; 
[cell.imageView setContentMode:UIViewContentModeScaleAspectFit]; 
//... 
// If the image has been downloaded I set it 
cell.imageView.image = iconDownloader.image; 

Điều này khiến tôi phát điên. Nó thực sự chỉ xảy ra ở một trong hai bảng trong ứng dụng của tôi, nhưng sau khi so sánh chúng với đường thẳng hoặc dòng tôi không thể thấy bất kỳ sự khác biệt nào. Hy vọng rằng ai đó đã đi qua điều này trước đây.

Cảm ơn!

EDIT: Tôi không có giải thích tốt cho giải pháp của tôi ngoài việc nói rằng hình ảnh trên một kích thước nhất định có vẻ dẫn đến hành vi này và sử dụng hình thu nhỏ thực tế (thậm chí hình ảnh hơi lớn hơn khung của UIImageView) không thể hiện hành vi này.

+1

Nếu bạn có UITableViewCell tùy chỉnh thì hãy đảm bảo rằng UIImageView của bạn không được đặt tên bằng "imageView" – kalpeshdeo

Trả lời

10

Những điều duy nhất mà đến với tâm trí ảnh hưởng mà sự xuất hiện kích thước & của chế độ xem trong SuperView của nó là:

  1. Bạn đang thay đổi các thuộc tính khung hình/giới hạn/trung tâm ở đâu không? Khung hình ban đầu được đặt ở đâu/như thế nào?

  2. imageView.autoResizingMask nên được đặt thành UIViewAutoResizingNone

  3. imageView.clipsToBounds nên được đặt thành YES

EDIT: gợi ý hơn

tôi chụp trong bóng tối b/c mã đăng của bạn có vẻ tốt và nếu bạn đã đặt imageView.clipsToBounds nên hạn chế hình ảnh được vẽ thành khung imageView. Dưới đây là một vài điều cần thử:

  1. Thực hiện tableView:willDisplayCell:forRowAtIndexPath: và đặt imageView thuộc tính tại đó. Nếu imageView.frame là vấn đề, điều này có thể sẽ không khắc phục được.

  2. Thêm UIImageView của riêng bạn vào ô được định cấu hình theo cách bạn muốn và không sử dụng thuộc tính được xây dựng trong tài sản imageView. Nếu hành vi của ô mặc định gây ra sự cố, thao tác này sẽ hoạt động.

EDIT: vấn đề hình ảnh lớn

Tôi không biết chính xác lớn như thế nào "hình ảnh thực sự lớn" được rằng bạn đang sử dụng nhưng họ có khả năng vấn đề này.Từ tài liệu UIImage (nhấn mạnh là của tôi):

Bạn nên tránh tạo các đối tượng UIImage lớn hơn 1024 x 1024 kích thước. Bên cạnh lượng bộ nhớ lớn như vậy ảnh sẽ tiêu thụ , bạn có thể gặp sự cố khi sử dụng hình ảnh dưới dạng họa tiết trong OpenGL ES hoặc khi vẽ hình ảnh vào chế độ xem hoặc lớp. Giới hạn kích thước này không áp dụng nếu bạn đang thực hiện các thao tác mã dựa trên mã, chẳng hạn như định lại kích thước hình ảnh lớn hơn 1024 x 1024 pixel bằng cách vẽ nó vào ngữ cảnh đồ họa được bitmap hỗ trợ. Trên thực tế, bạn có thể cần phải định lại kích thước hình ảnh theo cách này (hoặc chia nhỏ hình ảnh thành một số hình ảnh nhỏ hơn ) để vẽ hình ảnh đó theo một trong các chế độ xem của bạn.

+0

Không, tôi không thay đổi khung/giới hạn/trung tâm ở bất kỳ đâu. Làm thế nào nó được thiết lập ban đầu tôi không chắc chắn. Tôi đã thêm các đề xuất từ ​​2 và 3 nhưng không có kết quả. –

+0

Tôi có một nghi ngờ rằng nó đã làm với thực tế là những hình ảnh tôi đang đặt trong bảng với vấn đề là thực sự lớn trong khi những hình ảnh trong bảng mà không có vấn đề là hình thu nhỏ thực tế. –

+0

không quan trọng b/c bạn đã đặt 'contentMode' để vừa với chúng trong giới hạn của' imageView' và bạn đã đặt 'clipToBounds' để đảm bảo rằng' imageView' sẽ không vẽ bất kỳ thứ gì ngoài giới hạn của nó bất kể . Nếu bạn đang sử dụng ô chuẩn (so với tùy chỉnh) thì khung 'imageView' được định cấu hình cho bạn. Bạn có thể đăng thêm mã hiển thị cấu hình/khởi tạo ô cũng như trình xử lý hình ảnh đã tải xuống. Nó cũng có thể là một cái gì đó trong một phương thức ủy nhiệm 'tableView'. Là một sang một bên, nếu các hình ảnh tải về là rất lớn, bạn có thể nên quy mô chúng để hiển thị để bảo tồn tài nguyên. – XJones

0

này là khá khó xảy ra, nhưng bạn nên cố gắng nhìn vào những gì xảy ra với khung của subviews của UITableViewCell khi isSelected tắc tài sản của mình NO-YES (Tức là những gì sẽ xảy ra khi bạn chạm vào một tế bào). Tôi nghi ngờ rằng sẽ giúp nhiều, nhưng nó có giá trị nhìn vào (nếu bạn có thể tìm thấy bất cứ điều gì ... đó là tất cả dưới mui xe của UITableViewCell tôi sẽ tưởng tượng).

Bạn cũng nên xem xét thuộc tính clipsToBounds của imageview. Có thể là có cái gì đó để làm với nó?

1

Trong những trường hợp này, tôi sử dụng khung công cụ Trình tải hình ảnh này. Nó bao gồm một phương pháp để thiết lập một hình ảnh giữ chỗ của bạn lựa chọn, trong khi tải hình ảnh trong nền, và như là một lợi ích bổ sung nó lưu trữ hình ảnh đảm bảo cùng một hình ảnh sẽ không bao giờ phải được tải về hai lần. Đó là một tác phẩm tuyệt vời mà tôi thấy rất hữu ích cho việc tải hình ảnh tableview.

SDWebImage: https://github.com/rs/SDWebImage

+0

Tôi đang sử dụng một mẫu tương tự. Cảm ơn. –

1

tôi đã cùng một vấn đề, và tôi đã không tìm ra lý do cho điều đó. Dù sao, đó là thứ liên quan đến hình giữ chỗ: nếu bạn tải hình ảnh có cùng kích thước mà trình giữ chỗ, không thay đổi kích thước sẽ được thực hiện, nhưng nếu kích thước không khớp, hình ảnh được tải sẽ được thay đổi kích thước thành thứ nguyên trình giữ chỗ và thay đổi kích thước lại khi được nhấp.

Vì vậy, nếu bạn muốn tránh sự cố, hãy sử dụng trình giữ chỗ khớp với chiều cao hàng.

0

làm một cái gì đó giống như

CGRect bounds = [self bounds]; 
[self setImage:image]; 
[self setBounds:bounds]; 

khi thiết hình ảnh sửa chữa vấn đề đối với tôi

3

Vấn đề của tôi là hơi khác nhau, tôi đã có một tùy chỉnh UITableViewCell với UIImageView riêng và khi tế bào biến mất và xuất hiện trở lại, hình ảnh sẽ kích thước không đúng. Vấn đề của tôi là tôi đã đặt cell.imageView ở một nơi và cell.thumbnail (hình ảnh tùy chỉnh) ở một nơi khác, vì vậy tôi đã thay đổi tất cả các tham chiếu đến cell.thumbnail.

Hy vọng nó sẽ giúp ai đó trong tương lai gặp vấn đề tương tự.

+0

Vấn đề tương tự đối với tôi: đảm bảo rằng 'UIImageView' tùy chỉnh trong một ô không được đặt tên' imageView' (đặt tên là 'photoView') đã khắc phục sự cố. Tôi đoán rằng chuẩn 'imageView' được nạp động và được thêm dưới dạng subview khi bạn truy cập thuộc tính đó .. – raheel

1

làm theo các bước sau:

  1. Chọn ImageView trên di động tùy chỉnh của bạn
  2. đi đến Hiện để nhận dạng Inspector
  3. Scroll tất cả các cách để cuối cùng và bỏ chọn "User Interaction Enabled" hộp kiểm.
+0

điều này làm việc cho tôi. Cảm ơn! – Nancy

+0

* thở dài * thực sự là không. Đó là một vấn đề liên tục đối với tôi. – Nancy

0

Nếu bạn tải lại tableview khi nó kết thúc tải, hình ảnh có được kích thước mà nó được giả sử có

[self.tableview reloadData]; 
13

Nếu bạn có tùy chỉnh UITableViewCell sau đó hãy chắc chắn rằng UIImageView của bạn không được đặt tên với " imageView "

+1

Trong trường hợp của tôi, tôi đã có một ổ ảo bên trái vẫn được gọi là imageView mà tôi cần xóa. –

+0

đáng ngạc nhiên đây cũng là vấn đề của tôi! Tôi đã thay đổi tên cửa hàng, nhưng không bao giờ xóa nó hoàn toàn. Hãy chắc chắn rằng bạn đang kiểm tra tất cả các tên ổ cắm của UIImageView của bạn. Vì lý do gì, việc đặt tên nó là imageView đã đổi kích thước UIImageView của tôi – Rickybobby

2

This answer đã giúp tôi. Nhưng tôi phải chắc chắn rằng để gọi [cell layoutSubviews] trong phương pháp mà thực sự làm các thiết lập, như thế này:

cell.imageView.image = image; 
[cell layoutSubviews]; 

Hy vọng điều này có thể được sử dụng cho bạn!

+0

không bao giờ gọi layoutSubviews trực tiếp – tspentzas

+0

@ user1826261 Tôi sẽ đánh giá cao một lời giải thích. Giúp tôi hiểu. –

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