Uso de UISearchController con UISearchBar en tableHeaderView en iOS11

¿Alguien ha retenido con éxito unUISearchBar en untableHeaderView de unUITableView en ios11? Por lo general, surgen problemas con el iPhone X en horizontal:

Apple recomienda usar el nuevosearchController propiedad:

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

Sin embargo, esto no siempre funciona. Aquí hay un ejemplo con código:

Falta iOS11 UISearchBar en UINavigationBar cuando está incrustado en UISplitViewController

Así que tratando de mantener elsearchBar entableHeaderView - un primer paso práctico es aplicar las restricciones de diseño automático apropiadas:

if (@available(iOS 11.0, *)) {
    UILayoutGuide *guide = self.tableView.safeAreaLayoutGuide;
    searchBar.translatesAutoresizingMaskIntoConstraints = NO;
    [searchBar.leftAnchor constraintEqualToAnchor:guide.leftAnchor].active = YES;
    [searchBar.rightAnchor constraintEqualToAnchor:guide.rightAnchor].active = YES;
}

lossearchBar se dimensiona correctamente cuando se muestra:

Sin embargo, el problema surge cuando elUISearchBar Está activado:

Esto parece ser un viejo problema. Existen numerosas preguntas y respuestas de stackoverflow relacionadas con temas como este. En este caso, al inspeccionar la jerarquía de vistas, aparece el ancho delUISearchBar está configurado incorrectamente Entonces esto se puede corregir:

- (void)didPresentSearchController:(UISearchController *)searchController NS_AVAILABLE_IOS(11_0)
{
    if (@available(iOS 11.0, *)) {
        CGRect frame = self.searchController.searchBar.frame;
        frame.size.width = [self safeWidthAvailable];
        self.searchController.searchBar.frame = frame;
    }
}

- (CGFloat)safeWidthAvailable
{
    CGRect frame = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.frame;
    CGFloat width = frame.size.width;
     if (@available(iOS 11.0, *)) {
       UIEdgeInsets insets = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.safeAreaInsets;
       width -= insets.left;
       width -= insets.right;
    }
    return width;
}

Entonces esto funciona:

Hasta que rotas conUISearchController activo:

Así que de nuevoUISearchController ha perdidoUISearchBar.

¿Por qué es tan difícil?

Una solución es guardar la búsqueda, deshabilitarUISearchController después de una rotación y vuelva a habilitarlo con la búsqueda guardada. Esto funciona, pero no debería ser tan complicado.

¿Alguna sugerencia?

Respuestas a la pregunta(0)

Su respuesta a la pregunta