2013-01-24 36 views
52

Tôi đang sử dụng UICollectionView với hai ô mẫu thử nghiệm. Các ô mẫu có độ rộng khác nhau và chứa các điều khiển khác nhau (xem hình ảnh và xem web). Tôi chắc chắn sẽ trả lại ô mẫu chính xác cho một chỉ mục cụ thể (tất cả các ô hiển thị nội dung chính xác), nhưng kích thước ô mẫu thử bị bỏ qua và kích thước mục của bộ sưu tập được sử dụng thay thế. Nó không giống như tôi đang tự thiết lập kích thước. Điểm của việc cho phép ô mẫu có kích thước trong bảng phân cảnh là gì nếu thuộc tính chỉ bị bỏ qua khi nó thực sự được hiển thị?Thuộc tính kích thước ô mẫu UICollectionView iOS bỏ qua

Trả lời

151

Kích thước của ô trong trình chỉnh sửa bảng phân cảnh chỉ nhằm giúp bạn thiết kế ô. Vì mỗi ô mẫu có thể có kích thước khác nhau, UICollectionView không biết kích thước ô nào sẽ chọn cho tất cả các ô. Đó là lý do tại sao bạn đặt kích thước thực tế bạn muốn sử dụng cho các ô của mình một cách riêng biệt. Bạn có thể làm điều đó trong nhà thiết kế bằng cách chọn chế độ xem bộ sưu tập và đặt Chiều rộng và Chiều cao Kích thước ô của nó trong trình kiểm tra Kích thước, trong tiêu đề "Bộ sưu tập Chế độ xem".

Hoặc, bạn có thể ghi đè phương thức sau và trả về một đối tượng CGSize chỉ định kích thước bạn muốn sử dụng cho mỗi ô. Sử dụng phương pháp này, bạn thực sự có thể có mỗi tế bào có kích thước khác nhau:

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

Ví dụ:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return CGSizeMake(100, 100); 
} 

điều khiển xem của bạn cần phải là một đại biểu của UICollectionViewDelegateFlowLayout để cho phương pháp này được gọi là. Vì vậy, đừng quên thêm rằng lời tuyên bố đại biểu đến file .h điều khiển quan điểm của bạn, chẳng hạn như:

@interface MyViewController() <UICollectionViewDelegateFlowLayout> 
+0

Tôi đã sử dụng bản vẽ tùy chỉnh để thêm các lớp gradient, uilabel và uiimage vào ô uicollectionview của tôi và nó không được vẽ ở kích thước chính xác trong chế độ xem uicollection của tôi. Đặt mã này trong bộ điều khiển chế độ xem chính của tôi đã khắc phục được sự cố. – MGM

+1

Nếu tất cả các ô có cùng kích thước, một cách hiệu quả hơn để chỉ định kích thước là đặt nó trong 'UICollectionViewFlowLayout'. ví dụ. 'flow.itemSize = CGSizeMake (50,100);' –

+1

Nhưng có cách nào để lập trình truy cập ô mẫu thử từ phương thức '-collectionView: layout: sizeForItemAtIndexPath:' không? (Dequeueing các tế bào bằng cách sử dụng một định danh tái sử dụng không hoạt động, bởi vì điều đó kết thúc lên gọi phương pháp định cỡ, dẫn đến một vòng lặp vô hạn.) – erikprice

0

Nếu tất cả các tế bào của bạn có cùng kích thước, bạn chỉ cần thiết lập các thuộc kích thước tế bào của s UICollectionView đến giống như thuộc tính kích thước của UICollectionViewCell.

17

Nếu tất cả các ô có cùng kích thước và bạn có thể thiết lập các itemSize trên UICollectionViewFlowLayout

Ví dụ:

((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100); 
+2

Dường như bộ sưu tậpViewLayout.itemSize không khả dụng trong IOS6 – Sam

0

Bạn có thể thiết lập kích thước của UICollectionViewCell trong UICollectionView tài sản.

Trong bảng phân cảnh, chọn Collection View tại Document Outline, sau đó chỉnh sửa Cell Size trong Size Inspector.

Và bạn nên thay đổi Loại kích thước của ô thành Mặc định, nếu là Tùy chỉnh.

4

Swift, làm việc cho iOS mới nhất.

(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize 

Tôi không có đủ điểm để trả lời cho Sam, nhưng điều quan trọng là nó không phải là UICollectionViewLayout nhưng UICollectionViewFlowLayout.

1

Trong Swift bạn có thể gọi phương thức đại biểu sizeForItemAtIndexPath để đặt kích thước cho mỗi ô.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

     if indexPath.row == 0 { 
       // Set the size for cell no. 0 
     }else if indexPath.row == 1 { 
       // Set the size for cell no. 1 
     } 
    } 

Tôi hy vọng điều đó sẽ hữu ích. Cảm ơn!

0

Sử dụng đại biểu mặc định của nó. . .

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize mElementSize; 
    mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60); 
    return mElementSize; 
} 
Các vấn đề liên quan