【问题标题】:iOS7 UIRefreshControl changes contentInsetiOS7 UIRefreshControl 更改 contentInset
【发布时间】:2023-03-25 21:48:01
【问题描述】:

我的应用中有一个UINavigationControllerUINavigationBar 设置为不透明,所有滚动视图都不会在栏下方重叠。

在一个视图中,我有一个UITableViewUITableView 的框架在我的 iPhone 5 上是 (0 0; 320 504)。即高度是 568 - 64(导航栏和状态栏的高度)。

UITableViewcontentInset(0, 0, 0, 0)。当表格视图第一次加载时,contentOffset(0, 0)

这很好。效果很好。

我在表格视图中添加了UIRefreshControl。这工作了几次,但在几次拉动刷新之后,顶部的内容就会“卡在”导航栏下。

发生这种情况时,我检查了contentInset,现在它是(-60, 0, 0, 0)

有什么方法可以阻止 UIRefreshControl 更改 contentInset

【问题讨论】:

  • 删除了我的答案,因为您显然已经排除了它。我猜你是在调用 endRefreshing?
  • 不用担心。是的,当我在控件上调用endRefreshing 时,它会消失。这可以正常工作几次,但随后就吓坏了,contentInset 更改隐藏导航栏下的前几行。
  • 刷新后您可能会重新设置框架,但您不必这样做。
  • 我现在已经通过在结束刷新后手动将 contentInset 设置回 0 来解决它。但是现在它没有动画刷新控件的消失。它只是跳回来。如果我尝试对其进行动画处理,它会崩溃。大声笑
  • 您可能会尝试的最后一件事是在 IB 中添加 UIRefreshControl。如果您单击 UITableviewController 在 Storyboard 上,然后在 Attributes Inspecter 中,将 Refreshing 设置设置为启用,它会为您添加一个 UIRefresh 控件。然后,您可以将 IBAction 链接到它或在 viewDidLoad 中添加选择器。可能值得一试。

标签: ios objective-c uitableview uirefreshcontrol


【解决方案1】:

这可能是 UIRefreshControl 目前仅在 UITableViewController 上支持的原因,而不是通过添加到任何滚动视图(在许多情况下您可以逃脱)。

刷新控件通过修改滚动视图的内容插入来发挥其魔力 ​​- 特别是在它结束刷新时。不幸的是,视图控制器也在修改滚动视图的内容插图,以使其适合半透明导航和状态栏。乐趣随之而来。这是否也是 iOS 6 上的一个问题(或者,我在处理同一问题时称之为“好旧的 iOS6”)。

最快的解决方案可能是将表格视图添加为子 UITableViewController 而不是简单的子视图。我认为 UITableViewController 在刷新结束时为您管理插图。如果这不起作用,我有解决方法,但它必须等到我回到办公室。

【讨论】:

  • 我现在似乎已经解决了这个问题。我意识到NSOperationcompletionBlock 是在与操作相同的线程上调用的。这是我打电话给endRefreshing的地方。我将它发送到主线程,它现在可以在不更改contentInset 的情况下工作。你有任何关于UIRefreshControl 的链接吗?仅官方支持UITVC
  • 文档说它被分配给一个 UITVC。 addSubview: 东西只在 SO 中提到,从不在文档中。
  • 查看 Dave DeLong 对此答案的评论:stackoverflow.com/a/12502450/852828
  • 我把整个东西改成了 uitvc,现在一切正常。即使在切换到主线程后,我也遇到了问题,它显示出奇怪的行为。
  • 我遇到了完全相同的问题。我正在使用带有 UICollectionView 的 UiRefreshControl。它似乎改变了我的 contentInset。在 endRefresh 之后,我再次将我的 contentInset 设置为正确的值。这样好吗?或者我们是否必须避免将 UIRefreshControl 与 CollectionView 一起使用
【解决方案2】:

重置您的表格视图 contentInset。

-(void)pullToRefresh
{
    [self.tableView reloadData];
    [self.refreshControl endRefreshing];
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}

【讨论】:

    【解决方案3】:

    您需要在 UICollectionView 中覆盖 setContentInset:

    - (void)setContentInset:(UIEdgeInsets)contentInset {
      if (self.tracking) {
        CGFloat difference = contentInset.top - self.contentInset.top;
        CGPoint translation = [self.panGestureRecognizer translationInView:self];
        translation.y -= difference * 3.0 / 2.0;
        [self.panGestureRecognizer setTranslation:translation inView:self];
      }
      [super setContentInset:contentInset];
    }
    

    【讨论】:

    • 您提到的网址已不存在
    【解决方案4】:

    如果有人通过更改控件属性(属性标题、色调等)遇到UIRefreshControl 的问题,我将在此处添加此答案:

    不要乱用-viewDidLoad: 上的UIRefreshControl,改用-viewDidAppear:

    【讨论】:

    • 确保在每次页面出现时都设置条件 if(!refreshControl) else 它会向其中添加刷新控制。
    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多