2016-11-18 21 views
0

カスタムUICollectionViewFlowLayoutを持つcollectionViewがあります。 最後のコレクションビューセルがUITextFieldに含まれています。UICollectionView autolayout strange behavior

- (IBAction)textFieldDidChange:(UITextField*)textField { 

     [_collectionView.collectionViewLayout invalidateLayout]; 

} 

セルは、テキストフィールドの幅に応じresizibleのは、これは私がときにそれを次の行に移動するにはテキストフィールドが含まれているセルをしたい

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { 

NSArray* attributesForElementsInRect = [super layoutAttributesForElementsInRect:rect]; 
NSMutableArray* newAttributesForElementsInRect = [[NSMutableArray alloc] init]; 

// use a value to keep track of left margin 
CGFloat leftMargin = 0.0; 

for (id attributes in attributesForElementsInRect) { 
    UICollectionViewLayoutAttributes* refAttributes = attributes; 
    // assign value if next row 
    if (refAttributes.frame.origin.x == self.sectionInset.left) { 
     leftMargin = self.sectionInset.left; 
    } else { 
     // set x position of attributes to current margin 
     CGRect newLeftAlignedFrame = refAttributes.frame; 
     newLeftAlignedFrame.origin.x = leftMargin; 
     refAttributes.frame = newLeftAlignedFrame; 
    } 
    // calculate new value for current margin 
    leftMargin += refAttributes.frame.size.width + 8; 
    [newAttributesForElementsInRect addObject:refAttributes]; 
} 

NSLog(@"newAttributesForElementsInRect : %@", newAttributesForElementsInRect); 
return newAttributesForElementsInRect; 
} 

カスタムレイアウトの私のコードです十分に大きくなった。 layoutAttributesForElementsInRect:(CGRect)rectは正しいフレームを記録しますが、オフスクリーンでスワイプしてスワイプするまでセルは更新されません。 私は、セルに新しいフレームをすぐに取得させるために何かできることがあります。

UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:[attributesForElementsInRect indexOfObject:attributes] inSection:0]]; 

if (!CGRectEqualToRect(cell.frame, refAttributes.frame)) 
    cell.frame = refAttributes.frame; 

この:

おかげ

+0

setLayoutNeededの後にlayoutifneededを使ってテストしましたか? – santhosh

+0

はいレイアウトを無効にした後、[self.view setNeedsLayout]と[self.view layoutIfNeeded]を試しましたが、何も動作しません。 内部のテキストフィールドが大きくなると、セルの幅が広がるのが不思議です。セルが次の行に移動するときに問題が発生します。それdoes not't – zizoodiesel

+0

私は、私は気づいたcontentViewの高さは、collectionViewの高さが成長し、そのセルは次の行にジャンプしますが、私はスクロールアップ何も起こらず、セルが消えて、次回セルが正しい位置 – zizoodiesel

答えて

0

だから研究の二日後、私は私がこのようlayoutAttributesForElementsInRectでセルフレームを設定することによって、それを回避するために管理し、この問題 への適切な解決策を見つけるカント完全な機能です

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { 

NSArray* attributesForElementsInRect = [super layoutAttributesForElementsInRect:rect]; 
NSMutableArray* newAttributesForElementsInRect = [[NSMutableArray alloc] init]; 

// use a value to keep track of left margin 
CGFloat leftMargin = 0.0; 

for (id attributes in attributesForElementsInRect) { 
    UICollectionViewLayoutAttributes* refAttributes = attributes; 
    // assign value if next row 
    if (refAttributes.frame.origin.x == self.sectionInset.left) { 
     leftMargin = self.sectionInset.left; 
    } else { 
     // set x position of attributes to current margin 
     CGRect newLeftAlignedFrame = refAttributes.frame; 
     newLeftAlignedFrame.origin.x = leftMargin; 
     refAttributes.frame = newLeftAlignedFrame; 
    } 
    // calculate new value for current margin 
    leftMargin += refAttributes.frame.size.width + 8; 
    [newAttributesForElementsInRect addObject:refAttributes]; 


    UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:[attributesForElementsInRect indexOfObject:attributes] inSection:0]]; 

    if (!CGRectEqualToRect(cell.frame, refAttributes.frame)) 
     cell.frame = refAttributes.frame; 


} 
} 

これは誰かを助けるでしょう誰かがより良い解決策を持っています