2013-04-15 56 views
52

我正在使用UICollectionView使用流佈局。 我爲此做了一個自定義UICollectionViewCell。 但在運行控制檯不斷拋出此項目無差錯UICollectionView佈局問題

UICollectionViewFlowLayout的行爲沒有定義的,因爲: 項目高度必須小於頂部UICollectionView減去部分插圖和谷值的高度。

我已經確定了細胞的大小是正確

有沒有人能解決這個問題。 在此先感謝。

問候 Nitesh

+0

請添加一些關於flowLayout.itemSize,collectionView.fram的信息!旋轉或viewDidLoad時崩潰? – Alex

+7

我發現只有當我選擇滾動方向爲水平時纔會出現此錯誤。 – Nitesh

+1

它不會崩潰只是UI變空白。 這是單元格的大小。 300X460 收藏查看框架-300X480 佈局框架-300X480 我已將xib中的所有這些值取入 我希望收藏視圖水平滾動而不是垂直滾動。 – Nitesh

回答

18

試圖創建全屏細胞收集意見時,本來這個問題我自己幾次。我的問題是由IB/Storyboard中4英寸屏幕的佈局以及指定320 * 568的項目大小引起的,但是使用3.5英寸屏幕(其高度爲480)在模擬器中運行。解決方案是在代碼如下:

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout; 
layout.itemSize = self.collectionView.frame.size; 

這可確保在運行時正確設置單元大小。

+2

爲什麼您將整個視圖的大小指定爲單個大小細胞 ? – expert

+1

我遇到了全屏單元格的問題。不確定OP是否也是如此,但這是您遇到此問題最明顯的方式。 –

2

一定要爲UICollectionView和UICollectionviewcell設置正確的自動調整掩碼。 這個固定我的問題的iPhone 4仿真

+0

此外,在單元的contentView(或UITableViewCell的內容視圖)上設置自動調整掩碼可以幫助 –

36

我發現,使用storyboards,你必須去到storyboard並點擊整體View Controller(認爲應該以藍色高亮顯示),然後轉到Attributes Inspector(第四屏幕右側的標籤),並取消選中「頂部酒吧」,「底部酒吧」和「不透明酒吧」。這爲我解決了問題,併爲我的同事解決了問題。

+6

這與代碼中的等效內容相同嗎? – Lucien

+0

我發現取消選中「調整滾動查看插頁」刪除了警告。 (在故事板中使用故事板,Autolayout) –

+0

不適合我... –

25

我在使用集合視圖呈現全屏視圖控制器時遇到了一些問題。

基本上在運行時,它會要求項目的規模和簡單地返回集合視圖的大小:如果您使用的是故事板和經銷商的佈局

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return self.collectionView.frame.size; 
} 
+4

這比我的回答要好,如果你想支持輪換 –

10

,調試這類問題真的很難...

我試圖在iPhone上顯示UICollectionViewCell全屏時出現類似的問題。

大部分的時間問題是與細胞的大小

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

或直接在flowLayout.itemSize設置。

但...嘗試:

  1. 選擇的ViewController:

Selecting View Controller

  • 然後取消擴展邊緣選項:
  • Disable Extend Edges Options

    而現在嘗試設置您的自動佈局構造aints。

    祝你好運。

    +0

    謝謝!這救了我 –

    21

    我知道這是一個非常晚的答覆,但我也經歷過這個。

    在我的視圖控制器,我們稱之爲MyViewController我有一個使用自定義UICollectionViewCellUICollectionView。我正在執行方法collectionView:layout:sizeForItemAtIndexPath,在那裏我返回一個取決於UICollectionView的高度的項目大小。

    MyViewController是在故事板中使用自動佈局來控制UIViewController的高度。

    單元在縱向模式下看起來很好,但在橫向模式下沒有。

    我通過在viewWillLayoutSubviews方法內使我的UICollectionView無效UICollectionViewLayout解決了我的問題。

    - (void)viewWillLayoutSubviews { 
        [self.myCollectionView.collectionViewLayout invalidateLayout]; 
    } 
    

    早些時候,我曾試圖佈局內無效willAnimateRotationToInterfaceOrientation:duration,但沒有奏效。原因可能是所有視圖的大小都沒有計算出來,所以我們必須等到autolayout完成它的魔術。我指的是this SO thread

    更新雨燕4.0:上述修正

    override func viewDidLayoutSubviews() { 
        super.viewDidLayoutSubviews() 
        self.myCollectionView.collectionViewLayout.invalidateLayout() 
        } 
    
    +0

    謝謝!經過數小時嘗試不同的建議,這個簡單的解決方案消除了我的佈局警告 – iksnae

    +0

    @nitesh我的答案解決了你的問題btw? – Sajjon

    -3

    沒有爲我做。 我這個

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
    {CGFloat currentWidth = collectionView.frame.size.width; 
    UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout sectionInset]; //here the sectionInsets are always = 0 because of a timing issue so you need to force set width of an item a few pixels less than the width of the collectionView. 
    
    CGFloat width = currentWidth - 10; 
    } 
    
    +3

    這似乎是不完整的代碼。退貨聲明在哪裏?它只是CGSize(寬度,collectionView.frame.size.height)還是你改變了它? – Vive

    1

    我只是碰到了同樣的錯誤消息固定的,但對我來說,問題是,當我從API接收到新數據,並試圖刷新我的CollectionView,那個叫[collectionView reloadData] WASN的方法不會在主線程中調用它。

    希望這可以幫助別人......

    1

    我有同樣的問題

    的UICollectionViewFlowLayout的行爲沒有定義的,因爲: 項目高度必須小於UICollectionView減去的高度部分插入頂部和底部值。

    我通過檢查節Insets中的值解決了這個問題。而對於固定單元大小,我已經使用了下面的代碼。

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ 
    CGSize result = [[UIScreen mainScreen] bounds].size; 
    CGFloat scale = [UIScreen mainScreen].scale; 
    result = CGSizeMake(result.width * scale, result.height * scale); 
    CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width - 20; 
    CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120; 
    
    return CGSizeMake(cellWidth, cellHeight); 
    
    
    } 
    
    2

    對我來說,我使用AKPickerView這是給我喜歡這裏提到的那些警告擺一個自定義的UIView內。我所做的所有消除警告的方法都是在屬性檢查器中爲我的自定義UIView取消選中名爲「AutoResize Subviews」的框。這讓警告非常沉重,我認爲我的記錄器停止了工作。

    enter image description here

    3

    這固定我的問題:

    -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
    return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70); 
    } 
    

    U可以從頂部和底部此屏幕上看到的填充值:

    enter image description here

    0

    如果要加載的CollectionView通過容器視圖+ UICollectionViewController,你可能已經在容器上設置了高度約束視圖正在限制集合視圖本身的高度。在我的情況下,我發現collectionView.contentSize比我在容器視圖上設置的約束更高。

    顯然這是一個邊緣案例,但萬一你有類似的設置,我想我會添加此評論。