1

换句话说——你怎么知道,在 UICollectionViewFlowLayout中,关联的集合视图何时重新加载了数据?


我正在使用BPXLFlowLayoutBrandon Alexander 的流行和真棒,

https://github.com/whilethis/UIKit-Dynamics-101/blob/master/Collection%20View%20Dynamics/Collection%20View%20Dynamics/BPXLFlowLayout.m

这是制作“有弹性”集​​合的最佳方式,例如 iOS 消息应用程序。

如何在 iOS 7 中复制弹跳气泡的消息

我在 BPXLFlowLayout 和其他 UICollectionViewFlowLayout 方法中发现了一个真正的问题。通常,您只在一个布局、一个集合视图中“使用它们一次”。假设您有一个集合视图“BouncyViewHouses”

@interface BouncyViewHouses : UICollectionViewController

使用 BPXLFlowLayout

一切都很好,直到你重新加载。或者让我感到困惑的是,如果您在另一个集合视图上使用相同的 BPXLFlowLayout,您似乎遇到了同样的问题。

要解决这个问题,你必须做这样的事情

@implementation BouncyViewHouses

-(void)safelyReloadBouncyTable
    {
    [self.collectionView reloadData];
    [(BPXLFlowLayout *)self.collectionView.collectionViewLayout fastSignal];
    }

每当您重新加载集合时,您必须“手动”将动画师归零。

因此,例如在 BPXLFlowLayout 中,我添加了一个新方法......

@interface BPXLFlowLayout ()
@property (nonatomic, strong) UIDynamicAnimator *animator;
@end

@implementation BPXLFlowLayout

-(void)fastSignal
    {
    // it's very difficult to have prepareLayout (or, anything) called when you
    // reload the collection data. in fact, you must call this manually.
    self.animator = nil;
    }

当我重新加载数据源时,我必须从集合视图中手动调用它。

(如果你不这样做,你会遇到很难解决的非常棘手的问题!)

我的问题..你会认为在 BPXLFlowLayout (或类似的)中你可以调用self.animator = nil;

在里面-(void)prepareLayout或者也许shouldInvalidateLayoutForBoundsChange:

但它不起作用!我尝试了所有方法,总之,当数据源重新加载到关联的集合视图上时,我无法弄清楚 UICollectionViewFlowLayout 中的“触发了什么”。

我想这是可能的,在 UICollectionViewFlowLayout 中真正触发了 NOTHING .. 在这种情况下,我的方法是添加手动痒痒,当你重新加载数据时“必须调用”它,我想这是唯一的方法。

4

0 回答 0