2012-03-28 19 views
11

Tôi đang phát triển một ứng dụng iOS 4.UIImageView, setClipsToBounds và cách hình ảnh của tôi bị mất đầu

Tôi đang sử dụng mã này vào một UIImageView trên một UITableViewCell:

cell.photo.contentMode = UIViewContentModeScaleAspectFill; 
[cell.photo setClipsToBounds:YES]; 

hình ảnh của tôi là cao hơn nhiều, và khi tôi đặt UIViewContentModeScaleAspectFill, hình ảnh được thu nhỏ để phù hợp với chiều rộng với chiều rộng UIImageView. Làm như vậy, hình ảnh càng lớn hơn UIImageView và tôi thấy nó ở bên ngoài UIImageView.

Sau đó, tôi cần sử dụng setClipsToBounds:YES để không cho phép điều này, nhưng giờ đây tất cả hình ảnh của tôi đều bị mất đầu.

Có cách nào để sử dụng UIViewContentModeScaleAspectFill và góc trái trên cùng bên trái của hình ảnh với góc trên cùng bên trái UIImageView không? Nếu tôi cần phải mất một phần của hình ảnh, tôi thích để mất chân của nó rằng đầu của nó.

CẬP NHẬT

Tôi đang sử dụng sdWebImage khuôn khổ và tôi đã sử dụng Vadim Yelagin câu trả lời và đây là mã của tôi bây giờ là:

[cell.photo setImageWithURL:[NSURL URLWithString:entry.photo] 
       placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
         success:^(UIImage *image) { 
          CGFloat scaleX = cell.photoBorder.bounds.size.width/image.size.width; 
          CGFloat scaleY = cell.photoBorder.bounds.size.height/image.size.height; 
          CGFloat scale = MAX(scaleX, scaleY); 
          cell.photo.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); 
          cell.photo.image = image; 
         } 
         failure:nil]; 

tôi phải chờ đợi để có được tất cả các hình ảnh được nạp và tải lại di chuyển xung quanh UITableView để xem hình ảnh bên phải trên ô bên phải (điều này là do hình ảnh được lưu trữ và tải nhanh hơn).

Thay vì sử dụng cell.photo.framecell.photo.image Tôi cần chuyển đến chặn indexPath.row để nhận ô phù hợp.

tôi có thể thêm một phương pháp mới để UIImageView + WebCache:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder success:(void (^)(UIImage *image, NSInteger row))success failure:(void (^)(NSError *error))failure; 
{ 
    [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 
} 

Nhưng nếu tôi làm điều đó, tôi nhận được một lỗi ở đây:

[self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 

Bởi vì bây giờ thành công không phải là loại (void (^)(UIImage *image))

Bạn có biết cách khắc phục sự cố này không?

Trả lời

0

Không có cách nào tích hợp để làm điều này, nhưng bạn có thể làm điều đó bằng tay:

UIGraphicsBeginImageContext(CGSizeMake(desiredWidth, desiredHeight)); 

[originalImage drawAtPoint...]; 
... 

UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

Cảm ơn, nhưng tôi không hiểu code của bạn, xin lỗi. – VansFannel

+0

Bạn tạo ngữ cảnh hình ảnh bằng cách sử dụng 'UIGraphicsBeginImageContext' và sau đó vẽ hình ảnh gốc được phóng to để nó lấp đầy toàn bộ ngữ cảnh nhưng phía trên cùng bên trái của hình ảnh ở (0 | 0). –

2

Afaik, cách dễ nhất là để tính toán khung của IMAGExem bằng tay từ kích thước của hình ảnh và khung bạn muốn nó vừa với.

Tạo chế độ xem với khung bạn hiện đang chỉ định cho imageView của bạn, làm cho hình ảnhXem chế độ xem phụ của nó. Đặt view.clipsToBounds = YES.

Sau đó, khi bạn gán một hình ảnh, làm một cái gì đó giống như

CGFloat scaleX = view.bounds.size.width/image.size.width; 
CGFloat scaleY = view.bounds.size.height/image.size.height; 
CGFloat scale = MAX(scaleX, scaleY); 
imageView.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); 
imageView.image = image; 
+1

Cảm ơn bạn.Giải pháp của bạn hoạt động nhưng tôi đang sử dụng khuôn khổ sdwebimage, và hình ảnh của tôi tải không đồng bộ và chúng là một phần của trên UITableViewCells, vì vậy tôi sẽ cần phải điều chỉnh mã của bạn để làm cho nó hoạt động. Tôi sẽ cập nhật câu hỏi của tôi với câu trả lời của bạn và viết ra vấn đề mới của tôi. – VansFannel

+0

Bạn có thể thử (khóa-giá trị) quan sát thuộc tính 'image' của imageView và điều chỉnh khung trong mã quan sát của bạn. Hoặc phân lớp UIImageView và ghi đè lên 'setImage:'. –

+0

Tôi đã cố gắng phân lớp nó nhưng tôi gặp phải một vấn đề khác. Tôi đã cập nhật câu hỏi của mình với vấn đề mới này. – VansFannel

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