UIRefreshControl oculto / oscurecido por mi UINavigationController's UINavigationBar

Estoy intentando usar un UIRefreshControl dentro de mi UITableViewController que está dentro de un UINavigationController , que tiene su propiedad hidesNavigationBar establecida en NO (por lo que la barra de navigation está visible).

El UIRefreshControl funciona, pero está oculto por el UINavigationBar . Me sorprende que no pueda encontrar a nadie más que se haya topado con este problema.

Posibles puntos relevantes:

  • Puse el rootViewController de mi UIWindow para ser mi UINavigationController .
  • Configuré el controller de vista inicial del UINavigationController estableciendo la propiedad viewControllers del UINavigationController .
  • Mi subclass UITableViewController está instanciada con una punta.
  • Instancio mi UIRefreshControl en el método viewDidLoad de mi subclass UITableViewController . Configuré la propiedad refreshControl de la subclass UITableViewController en este método.
  • El UIRefreshControl funciona perfectamente bien, y puedo ver una parte de él, pero está oculto por mi UINavigationBar . Parece completamente normal si establezco hidesNavigationBar en YES (pero no quiero ocultarlo).

Editar:

El código utilizado para crear y UIRefreshControl mi UIRefreshControl es:

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

Este fragment de código está en el método viewDidLoad de mi subclass UITableViewController , que es un controller de vista secundaria de un UINavigationViewController .

Para aquellos que se dirigen a iOS 7, parece que hay un nuevo problema presente en el que UIRefreshControl se dibuja detrás de UITableView de UITableView . Experimenté esto tanto al inicializar UIRefreshControl programáticamente como a partir de un storyboard. Una solución sencilla es actualizar la position zPosition del UIRefreshControl en viewDidLoad de su UITableViewController :

 self.refreshControl.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1; 

He encontrado una solución real, aquí está:

Tengo un UIViewController dentro de un UINavigationController con una UINavigationController NavigationBar translúcida. Dentro del UIViewController está la UITableView .

Quiero agregar un UIRefreshControl pero cuando lo hago, está oculto por la UIRefreshControl NavigationBar , como usted explica.

Aquí está mi código para que funcione:

 // 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); 

Con este código, su UITableViewController mostrará el RefreshControl perfección y mantendrá el efecto translúcido de NavigationBar cuando se desplace hacia abajo por las celdas.

Parece un error para mí, ya que solo ocurre cuando la propiedad contentOffset de tableView es 0

mira esta pregunta

UIRefreshControl que no muestra espinas cuando llama beginRefreshing y contentOffset es 0

Lo arreglé con el siguiente código (método para 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){ }]; } } 

No llame -setTranslucent: en su UINavigationBar . Luego, su control de actualización se colocará correctamente, debajo de la barra de navigation.

En iOS 7, self.view está debajo de la barra de navigation, excepto que escribe algo como sigue,

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

o

 self.navigationViewController.navigationbar.translucent = NO; 

Usando la respuesta de @ Jonathan conseguí que esto funcione bien. Pero como estoy usando storyboard, puse el contenido en él como si fuera el siguiente: Que en caso de que alguien necesite:

introduzca la descripción de la imagen aquí (xcode 6.4)