【问题标题】:Reloading UICollectionView causing flickering重新加载 UICollectionView 导致闪烁
【发布时间】:2013-10-08 01:45:26
【问题描述】:

我对 CollectionView 进行了子类化,并使用它来显示不同类别的图像集合。例如:最受欢迎、观看次数最多。我通过 TabbarController 访问每个类别/页面。

我的课程是:

主类 - MediaList - 用于根据请求的媒体类型在集合视图中获取和显示媒体的基类。

子类 - MostPopular 和 MostViewed 都是从主类继承的非常轻量级的类。

问题是,当我从 MostPopular 移动到 MostViewed 时,集合视图最初会显示最后一个类别的图片,然后刷新到新的……结果你会看到一个闪烁的效果。

来自 MediaList 的示例代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.mediaCollection.dataSource = self;
    self.mediaCollection.delegate = self;
    [self getMedia];
}

(void) getMedia 
{
    NSLog(@"/////////////////////////   GETTING MEDIA  /////////////////////////");

    XMLGenerator * sharedXmlGen = [XMLGenerator sharedXmlGenerator];
    GlobalVars * sharedGlobalVars = [GlobalVars sharedGlobalVars];
    sharedXmlGen.assetFlag = _contentFilter;
    NSLog(@"The filter is: %@", _contentFilter);
    [sharedXmlGen getPhotoVideoWithCallBackFunction:^{
    [_mediaCollection performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}];
}

来自子类的示例代码(最受欢迎)

- (void)viewDidLoad
{
    [super setContentFilter:FILTER_POPULAR];  //Set the filter for the type of content
    [super viewDidLoad];
// Do any additional setup after loading the view.
}

两点说明:

  1. 我应该补充一点,我正在尝试尽可能多地重复使用代码,而不必在情节提要或控制器上创建新视图。

  2. 因为返回的媒体非常动态并且可以定期更新,所以我不得不在 viewDidAppear 上重新加载我的数据(使用 getMedia)。现在这意味着每次选择特定页面都会导致在加载新视图时闪烁...

更新 - 经过进一步调查,这似乎与 uicollectionview 的子类化无关。相反,问题只是将数据重新加载到 uicollectionview 中。可以肯定的是,我只是单击了两个子类视图之一。我还在 viewdidAppear 方法中添加了一个 reload 方法,只是为了让问题变得更糟。也更容易看出问题在于集合视图中的最后一组图像最初显示最后一个类别的图片,然后再刷新新的图片。然后,一旦刷新集合,我就会闪烁。

*10 月 4 日更新 * 开始认为我最好的解决方案是显示等待指示器并在加载时阻止页面。我确实尝试将 uicollectionview 设置为 nil,并且相信这也可以解决问题,但不确定是否可以直接重置。

【问题讨论】:

  • 每个视图控制器都有自己的集合视图吗?还是您想为每个标签共享同一个标签?
  • 我正在尝试共享同一个集合视图。我有很多这样的页面/部分,所以我试图重用所有可能的东西。
  • @WilliamFalcon - 是的。我正在尝试共享相同的集合视图。我有很多这样的页面/部分,所以我试图重用一切可能的东西。我用两个澄清更新了我的原始帖子...

标签: objective-c xcode uitableview uitabbarcontroller uicollectionview


【解决方案1】:

虽然在上面的代码中可能不会立即显现,但根本原因实际上是 getMedia 调用。所有的子类化等都可以正常工作。

在 getMedia 调用中特别具有 reload 方法并正在创建问题。

[_mediaCollection performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2013-02-18
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多