18

我正在尝试使用UIRefreshControlinside my UITableViewController,它本身位于 a 内部UINavigationController,其hidesNavigationBar属性设置为NO(因此导航栏可见)。

UIRefreshControl作品,但被UINavigationBar. 我很惊讶我找不到其他遇到这个问题的人。

可能的相关点:

  • 我将 my 设置rootViewControllerUIWindowmy UINavigationController
  • 我通过UINavigationController设置viewControllers.UINavigationController
  • 我的UITableViewController子类是用笔尖实例化的。
  • 我在我的子类UIRefreshControlviewDidLoad方法中实例化我的UITableViewController。我在这个方法中设置refreshControl了子类的属性。UITableViewController
  • UIRefreshControl效果很好,我可以看到其中的一部分,但它被我的UINavigationBar. 如果我设置hidesNavigationBarYES(但我不想隐藏它),它看起来完全正常。

编辑:

用于创建和定位 my 的代码UIRefreshControl是:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self 
                   action:@selector(toggleRefresh:) 
         forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;

此代码片段在viewDidLoad我的UITableViewController子类的方法中,它是UINavigationViewController.

4

6 回答 6

44

对于那些以 iOS 7 为目标的用户,似乎存在一个新问题,UIRefreshControl即. 在以编程方式初始化和从情节提要中初始化时,我都经历了这一点。一个简单的解决方法是更新您的in :UITableViewbackgroundViewUIRefreshControlzPositionUIRefreshControlviewDidLoadUITableViewController

self.refreshControl.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1;
于 2013-09-18T14:57:52.713 回答
4

我找到了一个真正的解决方案,这里是:

我有一个带有半透明的UIViewController内部。里面有。UINavigationControllerNavigationBarUIViewControllerUITableView

我想添加一个UIRefreshControl但是当我这样做时,它被隐藏了NavigationBar,就像你解释的那样。

这是我使它工作的代码:

// Add a UITableViewController
self.tblViewController = [[UITableViewController alloc] init];

// Set the UITableView to it
self.tblViewController.tableView = self.tblView;

// Initialize the UIRefreshControl and set it's method
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(refreshTable) forControlEvents:UIControlEventValueChanged];

// Set the RefreshControl to the UITableViewController
self.tblViewController.refreshControl = self.refreshControl;

// Here is the thing ! Just change the contentInset to push down the UITableView content to 64 pixels (StatusBar + NavigationBar)
self.tblView.contentInset = UIEdgeInsetsMake(64.f, 0.f, 0.f, 0.f);

使用此代码,您UITableViewController将在向下滚动单元格时RefreshControl完美显示并保持半透明效果。NavigationBar

于 2014-08-15T06:29:21.643 回答
3

对我来说它看起来像一个错误,因为它仅在 tableView 的 contentOffset 属性为 0 时发生

看到这个问题

调用 beginRefreshing 并且 contentOffset 为 0 时 UIRefreshControl 不显示刺

我用以下代码(UITableViewController 的方法)修复了这个问题:

- (void)beginRefreshingTableView {

    [self.refreshControl beginRefreshing];

    if (self.tableView.contentOffset.y == 0) {

        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){

            self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);

        } completion:^(BOOL finished){

        }];

    }
}
于 2013-04-27T10:11:00.077 回答
1

在iOS 7中,self.view在navigationBar下,只不过你写了如下内容,

self.edgesForExtendedLayout = UIRectEdgeNone; // or UIRectEdgeAll & ~UIRectEdgeTop

或者

self.navigationViewController.navigationbar.translucent = NO;
于 2014-05-22T06:45:26.893 回答
0

使用@Jonathan 的回答,我得到了很好的效果。但是由于我使用的是故事板,所以我将内容插图设置为:以防万一有人需要:

在此处输入图像描述 (xcode 6.4)

于 2015-10-15T14:08:34.387 回答
-1

不要调用-setTranslucent:您的UINavigationBar. 然后,您的刷新控件将被正确定位在导航栏下方。

于 2013-07-23T19:25:24.533 回答