2013-04-17 30 views
24

Trong ứng dụng iphone của tôi, tôi đang hiển thị hình ảnh ở chế độ xem bộ sưu tập. Tôi tìm nạp hình ảnh từ các url, với các url tôi cũng nhận được kích thước hình ảnh. ví dụ: - giả sử có hai loại hình ảnh phong cảnh và chân dung. Tôi nhận được giá trị P cho ảnh chân dung và L cho hình ảnh ngangKích thước ô khác nhau trong UICollectionview

Làm cách nào để tùy chỉnh kích thước của ô sưu tập?

+0

Bạn có thể xem https://github.com/bryceredd/RFQuiltLayout. Có vẻ như thứ bạn có thể sử dụng cho số này – Rajneesh071

Trả lời

63

Sử dụng phương pháp này UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 
+0

Cảm ơn bạn. Tôi đã bị mắc kẹt ở đây, và mở một dự án mới để kiểm tra và làm việc. –

+1

PS. UICollectionViewDelegateFlowLayout bao gồm cả UICollectionViewDataSource và UICollectionViewDelegate, do đó bạn chỉ cần thêm vào các khai báo ủy nhiệm của bạn. –

9

1) Bạn có thể duy trì và trao đổi trên nhiều đối tượng bố trí, nhưng có một cách đơn giản hơn. Chỉ cần thêm dòng sau vào lớp con UICollectionViewController của bạn và điều chỉnh kích thước theo yêu cầu:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{  
    // Adjust cell size for orientation 
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { 
     return CGSizeMake(170.f, 170.f); 
    } 
    return CGSizeMake(192.f, 192.f); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.collectionView performBatchUpdates:nil completion:nil]; 
} 

Calling -performBatchUpdates:completion: sẽ làm mất hiệu lực bố trí và thay đổi kích thước các tế bào với hình ảnh động (bạn chỉ có thể vượt qua con số không cho cả hai params khối nếu bạn đã không phải trả thêm điều chỉnh để thực hiện).

2) Thay vì mã hóa cứng kích thước mục trong -collectionView:layout:sizeForItemAtIndexPath, chỉ cần chia chiều cao hoặc chiều rộng của giới hạn collectionView cho số lượng ô bạn muốn vừa với màn hình. Sử dụng chiều cao nếu số trang UICollectionView cuộn theo chiều ngang hoặc chiều rộng nếu nó cuộn theo chiều dọc.

2

Đây là những gì tôi đã làm. Lần đầu tiên tôi đặt kích thước của ô dựa trên kích thước của màn hình (để chúng tôi có thể nhận được số lượng hình ảnh tốt nhất trên mỗi hàng). Bạn có thể muốn thay đổi các con số cho phù hợp với nguyên nhân của bạn.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ 
CGFloat widthOfCell =(self.view.frame.size.width-30)/2; 
CGFloat heightOfCell =widthOfCell * 1.33; 
CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell); 
returnValue.height += 5; 
returnValue.width += 5; 
return returnValue; 

} 

sau đó tôi đã sử dụng một phương pháp xử lý ảnh để xác định phong cảnh hoặc chân dung nhà nước, và (đối với ứng dụng của tôi), tôi quyết định làm cho mỗi hình ảnh một bức chân dung:

if (sourceImage.size.width>sourceImage.size.height) { 
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage 
              scale: 1.0 
             orientation: UIImageOrientationRight]; 
    } 

Nếu bạn muốn có nó theo cách khác, hoán đổi số > với <

CAVEAT: phương pháp quay của tôi không được xem xét nếu hình bên trái hoặc phải. Nói cách khác, nếu một hình ảnh được phong cảnh bằng lộn ngược, mã của tôi không thể nhận ra điều đó. Tôi hy vọng một người khác có thể giúp bạn mặc dù, và tôi hy vọng tôi đã không đi theo dõi! :)

1

Đối nhanh chóng mở rộng FlowLayout cho bạn ViewController, nếu bạn cần để hiển thị hình ảnh động trên tế bào làm cho biến mà giữ hình ảnh tên vào xem contorller bạn và sử dụng này:

let imageData = ["image1","image2","image3","image4"] 

extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{ 
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let photo = UIImage(named: imageData[indexPath.row]) 
     return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!) 

} 

}