ios - uicollectionview教學 - xcode collection view




UICollectionView的單元格消失了 (6)

Rob關於這個bug的提示幫助了我。 該錯誤指出,如果部分插入並且單元格的寬度和間距與屏幕的寬度完全相加,則第一列有時會隨機消失並在某些地方重新出現某些單元格。 我沒有子類或更改單元格寬度,而是將故事板中左右兩側的部分插入從6更改為4,而我沒有再次看到問題。

發生了什麼

目前我有一個在UITableView中使用兩個UICollectionViews的應用程序。 這樣我創建了一個類似應用程序的Pulse News。 我的問題是,有時第6行和第11行完全消失,留下一個空白區域應該是單元格。 我真的不介意,如果所有的細胞都是這樣的(這種方式我可以假設我沒有做正確的事情),但問題是,這只是發生在那些特定的細胞上。

我的理論

第6行和第11行是我開始滾動時出現的行,所以默認情況下我能看到5個單元格,當我進行第一次水平滾動時,第6行會出現(有時會出現空白)。

我擁有的

我目前唯一要做的就是:

 [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

viewDidLoad 。 在創建細胞時:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];

    return cell;
}

所以在我的理解中沒有任何幻想在這裡發生。 我雖然在數據源(虛擬JSON文件)上有問題,但有時它工作正常並且單元格顯示,所以我想從那部分是可以的。

所以我的“問題”:有誰知道發生了什麼? 我真的不想說這是來自iOS的錯誤,但我想不出別的什麼。

編輯1.0

令人驚訝的是這種方法

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

indexPath [0,4]到[0,6]而不計算[0,5]。 我第一次真正在iOS中看到這種情況。

編輯2.0

我已經改變了創建單元格的方式,而不是出列我使用舊方法:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];

仍然是同樣悲傷的結果。


上面的答案對我不起作用,但在下載圖像後,我用[self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];替換了代碼[self.myCollectionView reloadData] [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; 要刷新集合視圖並顯示所有單元格,您可以嘗試一下。


在我的情況下(垂直滾動,細胞在第一個視圖中消失),細胞由於估計的大小不正確而消失。 看來, UICollectionView使用估計的大小來計算要在第一個視圖中加載的項目。 我將估計的尺寸設置得太高,導致在第一個屏幕中加載的項目數量計算錯誤。

當我估計高度位低時,所有細胞都正確顯示。


對我來說,這個問題似乎與我使我的collectionview適應開放式鍵盤以防止內容重疊的方式有關。

在我的觀察者回應KeyboardWillShow我有這個:

var userInfo = obj.UserInfo[UIKeyboard.FrameEndUserInfoKey];
if (userInfo is NSValue value)
{
    var rect = value.CGRectValue;
    var windowOffset = this.Superview.ConvertPointToView(this.Frame.Location, UIApplication.SharedApplication.KeyWindow);
    var newHeight = rect.Y - windowOffset.Y;

    this._controller.CollectionView.Frame = new CGRect(0, 0, this._controller.CollectionView.Frame.Width, newHeight);
}

將其更改為:

var userInfo = obj.UserInfo[UIKeyboard.FrameBeginUserInfoKey];
if (userInfo is NSValue value)
{
    var rect = value.CGRectValue;
    UIEdgeInsets contentInsets = new UIEdgeInsets(0, 0, rect.Height, 0);
    this._controller.CollectionView.ContentInset = contentInsets;
    this._controller.CollectionView.ScrollIndicatorInsets = contentInsets;
}

細胞消失問題徹底消失了。 這是使用xamarin的C#,但我希望它可以幫助別人。



那麼,做了什麼工作?

1)子類UICollectionViewFlowLayout

2)將我的UICollectionView的flowLayout設置為我的新子類。

3)在UICollectionViewFlowLayout子類的init方法上,設置所需的方向:

self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

就我而言,它是水平的。

4) 重要的部分

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
   return YES;
}

在這一刻,我應該提出一點理論,但說實話,我沒有任何線索。







uicollectionviewcell