【问题标题】:UIRefreshControl is in wrong position in UITableViewControllerUIRefreshControl 在 UITableViewController 中的位置错误
【发布时间】:2014-02-15 17:37:11
【问题描述】:

我已经看到很多关于 UIRefreshControl 的问题,我的 UITableViewController 也有问题。这个问题发生得如此随机,因此我无法弄清楚它为什么或如何发生。

问题是,有时当您在 tableView 上向下滚动时,UIRefreshControl 出现在错误的位置,并且看起来像在 tableView 本身的上方/顶部。我附上了问题的截图,以及我用于添加 UIRefreshControl 的代码,它也是刷新方法。

感谢您提供的任何帮助!

- (void)viewDidLoad
{
    self.refreshControl = [[UIRefreshControl alloc] init];

    [self.refreshControl addTarget:self action:@selector(refreshing:) forControlEvents:UIControlEventValueChanged];

    [self.tableView addSubview:self.refreshControl];

    self.tableView.tableFooterView = [[UIView alloc] init];
}

- (void)refreshing:(UIRefreshControl*)refreshControl
{
    [refreshControl beginRefreshing];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    [refreshControl endRefreshing];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
 }

【问题讨论】:

    标签: ios objective-c uitableview uirefreshcontrol


    【解决方案1】:

    覆盖 func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() refreshControl?.superview?.sendSubview(toBack: refreshControl!) }

    【讨论】:

    • 答案和上面一样。把它变成一个代码 sn-p
    【解决方案2】:

    这是 iOS7 的一个已知错误;有时刷新控件被错误地放在视图层次结构的前面而不是后面。您可以通过在布局后将其发送回来解决部分问题:

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

    动画仍然是不完美的,但至少它仍然会在表格视图下方。请为此问题打开bug report with Apple

    另外,正如另一个答案中所述,您不应该自己将刷新控件添加到视图层次结构中。表格视图控制器将为您完成此操作。但这不是这里的问题。

    Swift 版本

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        refreshControl?.superview?.sendSubview(toBack: refreshControl!)
    }
    

    【讨论】:

    • 那我怎么把它添加到tableView中呢?只需在刷新控件上调用 alloc init 即可?
    • @troop231 您创建它,添加目标/动作并将其分配给表视图控制器。它会为你处理好事情。
    • 我刚刚删除了 addSubview 部分,并且已经有了目标/动作,现在我该如何分配它?因为表格视图已经显示出来了
    • @troop231 self.refreshControl = [[UIRefreshControl alloc] init]; 足以让它显示。
    • @troop231 您已经使用 viewDidLoad 中的第一行代码添加到 tableView,不需要第 3 行。
    【解决方案3】:

    我遇到了同样的问题并用这个解决了它:

    override func viewDidLoad() {
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
        tableView.backgroundView = refreshControl // <- THIS!!!
    }
    

    将 refreshControl 分配为 backgroundView,而不是添加子视图

    【讨论】:

    • 这仅适用于您只希望在您的视图中显示 1 个东西,但如果您有无限滚动或其他东西之类的东西,这会破坏它
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 2013-01-21
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2013-10-14
    相关资源
    最近更新 更多