【问题标题】:UIRefreshControl displays above UICollectionViews CellsUIRefreshControl 显示在 UICollectionViews 单元格上方
【发布时间】:2015-12-14 18:03:21
【问题描述】:

我使用以下代码创建UIRefreshControl

_refreshControl = new UIRefreshControl();
_refreshControl.ValueChanged += RefreshTriggered;
_collectionView.InsertSubview(_refreshControl, 0);

而且我不知道为什么UIRefreshControl 会覆盖UICollectionViewCells。

这是我刚刚添加刷新控件时UICollectionView 的子视图:

[0]: {<UIRefreshControl: 0x7c132fe0; frame = (0 0; 594 60); hidden = YES; autoresize = W; layer = <CALayer: 0x7c133250>>}
[1]: {<UIImageView: 0x79f8a5d0; frame = (3 588.5; 588 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x79f89a70>> - (null)}
[2]: {<UIImageView: 0x79fab7d0; frame = (588.5 584; 2.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x796171f0>> - (null)}

这是在 UICollectionView 中加载项目时的子视图:

[0]: {<MovieCollectionViewCell: 0x796e7350; baseClass = UICollectionViewCell; frame = (0 0; 183 278.16); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7c244bc0>>}
[1]: {<MovieCollectionViewCell: 0x7c2b5850; baseClass = UICollectionViewCell; frame = (186 0; 183 278.16); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7c2b5950>>}
[2]: {<MovieCollectionViewCell: 0x7c2ba7d0; baseClass = UICollectionViewCell; frame = (0 281; 183 278.16); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7c2ba8d0>>}
[3]: {<MovieCollectionViewCell: 0x7c2bf440; baseClass = UICollectionViewCell; frame = (186 281; 183 278.16); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7c2bf540>>}
[4]: {<MovieCollectionViewCell: 0x7c2c42d0; baseClass = UICollectionViewCell; frame = (0 562.5; 183 278.16); clipsToBounds = YES; hidden = YES; opaque = NO; layer = <CALayer: 0x7c2c43d0>>}
[5]: {<MovieCollectionViewCell: 0x7c2c9160; baseClass = UICollectionViewCell; frame = (186 562.5; 183 278.16); clipsToBounds = YES; hidden = YES; opaque = NO; layer = <CALayer: 0x7c2c9260>>}
[6]: {<UIRefreshControl: 0x7c132fe0; frame = (0 -69.5; 369 60); autoresize = W; layer = <CALayer: 0x7c133250>>}
[7]: {<UIImageView: 0x7c159e80; frame = (3 522; 363 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7c159fb0>> - (null)}
[8]: {<UIImageView: 0x7c15a480; frame = (363.5 -66.5; 2.5 224); opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7c15a5b0>> - (null)}

谁有想法?

【问题讨论】:

    标签: c# ios xamarin uicollectionview


    【解决方案1】:

    尝试在这样的布局过程之后将refreshControll 发送到后面:

    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
    
        [self.collectionView sendSubviewToBack:self.refreshControl];
    }
    

    因为UITableViewUICollectionView 重复使用它们的单元格,它们有一种非常具体的方式来布置它们的子视图(可能通过layoutSubviews 的自定义实现)。因此,您插入自定义子视图的位置通常不会在布局过程之后保留。这就是为什么您必须覆盖 viewDidLayoutSubviews 并将视图放回您想要的位置的原因。

    UIRefreshControllUITableView 自动检测到并放回其他子视图之后,但UICollectionView 不是这种情况,您必须手动进行。对于任何其他自定义子视图,您必须同时为 UITableViewUICollectionView 执行此操作。

    【讨论】:

    • 这行得通,我将把它标记为已解决,但我想看看为什么会发生这种情况的解释。我认为这是 Xamarin 或 iOS 中的错误。
    • 查看我的编辑。从我记事起,事情就一直这样工作,所以我不会称它为错误,只是你需要知道的东西......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多