para pantalla ocultar modo incognito como aplicaciones aplicacion iphone user-interface

pantalla - iPhone: oculta la barra de búsqueda de UITableView por defecto



ocultar aplicaciones android (22)

Cambie los límites de tableView, esto se puede hacer dentro de viewDidLoad además de que no tiene que preocuparse si la tabla está vacía o no (para evitar la excepción).

CGRect newBounds = self.tableView.bounds; newBounds.origin.y = newBounds.origin.y + self.searchBar.bounds.size.height; self.tableView.bounds = newBounds;

Una vez que el usuario se haya desplazado hacia abajo de la tabla, la barra de búsqueda aparecerá y se comportará normalmente

Utilicé Interface Builder para crear una vista de tabla, a la que agregué la barra de búsqueda de la biblioteca y el controlador de pantalla de búsqueda para agregar funcionalidad de búsqueda. Sin embargo, IB lo configuró para que la barra esté visible en la parte superior de la pantalla cuando se muestra por primera vez.

Me gustaría saber cómo ocultar la barra de búsqueda por defecto, pero seguir navegando con la vista de tabla (ver la aplicación Apple''s Mail para ver un ejemplo). Intenté llamar a scrollRectToVisible:animated: en viewDidLoad para desplazar la vista de tabla hacia abajo, pero fue en vano. ¿Cuál es la forma preferida de ocultar la barra de búsqueda por defecto?


ContentOffset fue anotado en los comentarios de Tim y Joe D''Andrea, pero esto se amplió un poco agregando una animación para ocultar la barra de búsqueda. Noté que es un poco inesperado que la barra de búsqueda simplemente desaparezca.

Una pequeña actualización para aquellos que quieren apuntar a iOS 4.0 y superior, intente esto:

[UIView animateWithDuration:0.4 animations:^{ self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height); } completion:nil];

Respuesta anterior:

[UIView beginAnimations:@"hidesearchbar" context:nil]; [UIView setAnimationDuration:0.4]; [UIView setAnimationBeginsFromCurrentState:YES]; self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height); [UIView commitAnimations];


El código siguiente funciona para mí

self.tableView.contentOffset = CGPointMake(0.0, 44.0);


El método scrollToRowAtIndexPath provoca un bloqueo si no hay filas en la tabla.

UITableView es solo una vista de desplazamiento, por lo que simplemente puede cambiar el desplazamiento del contenido.

Esto comprueba que tiene una barra de búsqueda como tableHeaderView, y suponiendo que se desplaza para ocultarlo

if let searchHeight = tableView.tableHeaderView?.frame.height { tableView.setContentOffset(CGPoint.init(x: 0, y:searchHeight ), animated: false) }


Encuentro que la aplicación "Notas" no puede buscar elementos cuando TableView está en blanco. Así que creo que es solo usar -(void)addSubview:(UIView *)view para agregar una tabla en blanco al principio. Cuando agrega un elemento a su matriz de fuente de datos, ejecutará otra porción de código para cargar tableView.

Entonces mi solución es:

if([self.arrayList count] > 0) { [self.tableView reloadData]; //use jdandrea''s code to scroll view when cell==nil in cellForRowAtIndexPath self.tableView.scrollEnabled = YES; } else { tableBlank = [[UITableView alloc]initWithFrame:CGRectMake(0,0,320,416) style:UITableViewStylePlain] autorelease]; tableBlank.delegate = self; tableBlank.dataSource = self; [self.view addSubview:tableBlank]; }

Espero que esto ayude :-)


Hay muchas respuestas a esta solución, sin embargo, ninguna funcionó muy bien para mí.

Esto funciona perfectamente Sin animación, y se realiza en -viewDidLoad

- (void)viewDidLoad { [super viewDidLoad]; self.tableView.contentOffset = CGPointMake(0, self.searchBar.frame.size.height - self.tableView.contentOffset.y); }

Nota:

El código asume que tiene searchBar @property que está vinculado a la barra de búsqueda. De lo contrario, puede usar self.searchDisplayController.searchBar en self.searchDisplayController.searchBar lugar


Honestamente, ninguna de las respuestas realmente resolvió el problema (para mí). Si su vista de tabla no tiene filas O la altura de fila es diferente, estas respuestas no son suficientes.

Lo único que funciona:

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.tableView.contentOffset = (CGPoint){.y = self.tableView.contentOffset.y + self.searchController.searchBar.frame.size.height}; }


Intenté configurar el contenido offset y scrollToIndexpath pero nada funcionó satisfactoriamente. Eliminé la configuración de tableHeaderView como searchBar de viewDidLoad y lo configuré en delegar scrollview como se muestra a continuación

override func scrollViewWillBeginDragging(scrollView: UIScrollView) { if scrollView.contentOffset.y < 0 && tableView.tableHeaderView == nil { tableView.tableHeaderView = searchController.searchBar tableView.setContentOffset(CGPointMake(0, scrollView.contentOffset.y + searchController.searchBar.frame.size.height), animated: false) } }

Funcionó como un amuleto. La configuración de compensación de contenido es para un desplazamiento suave.


La compensación de contenido es el camino a seguir, pero no funciona el 100% del tiempo.

No funciona si está configurando estimatedRowHeight en un número fijo. No sé el trabajo alrededor todavía. Creé un project muestra el problema (s) y creé un radar con Apple.

Mira el proyecto si quieres un ejemplo rápido de cómo configurarlo todo.


Las otras respuestas a esta pregunta no funcionaron en absoluto para mí, tuvieron un comportamiento extraño cuando el tableView tenía 0 filas, o estropearon la posición de desplazamiento al ir y venir entre las líneas de pedido primarias y anidadas. Esto funcionó para mí (el objetivo es ocultar UISearchBar cuando está en carga):

public override func viewWillAppear(animated: Bool) { if self.tableView.contentOffset.y == 0 { self.tableView.contentOffset = CGPoint(x: 0.0, y: self.searchBar.frame.size.height) } }

Explicación
Cada tableView que aparezca tableView , este código verifica si UISearchBar está visible (lo que significa que la posición y de contentOffset , aka posición de desplazamiento, es 0 ). Si lo es, simplemente se desplaza hacia abajo a la altura de la barra de búsqueda. Si la barra de búsqueda no está visible (piense en una lista más grande de elementos en tableView ), no intentará desplazar la vista de tableView , ya que esto arruinaría el posicionamiento cuando regrese de una línea de pedido anidada.

Nota lateral
Recomiendo poner este código en un método diferente para garantizar la responsabilidad individual y darle la posibilidad de volver a llamarlo en cualquier momento en su código.


Mi objetivo era ocultar la barra de búsqueda agregada a tableHeaderView del estilo simple de TableView en el guión gráfico cuando se carga el controlador de vista y mostrar la barra cuando el usuario se desplaza hacia abajo en la parte superior de UITableView. Entonces, estoy usando Swift y he agregado una extensión:

extension UITableView { func hideSearchBar() { if let bar = self.tableHeaderView as? UISearchBar { let height = CGRectGetHeight(bar.frame) let offset = self.contentOffset.y if offset < height { self.contentOffset = CGPointMake(0, height) } } } }

en viewDidLoad () solo llame:

self.tableView.hideSearchBar()


Ninguno de los anteriores funcionó para mí, así que en caso de que alguien tenga el mismo problema.

Tengo searchBar configurado como tableHeaderView en una tabla agrupada en iOS7. En viewDidLoad tengo tableView.contentOffset = CGPointMake(0, 44); para mantener searchBar inicialmente "oculto". Cuando el usuario se desplaza hacia abajo, searchBar está desplazado

Objetivo: ocultar la barra de búsqueda en el botón Cancelar

En searchBarCancelButtonClicked(searchBar: UISearchBar!)

Esto no funcionó: [yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; tableView estaba desplazándose demasiado hacia arriba, lo que provoca que la fila 0 vaya detrás de toolBar.

Esto no funcionó: tableView.ContentOffset = CGPointMake(0, 44) - no pasa nada

Esto no funcionó: tableView.ContentOffset = CGPointMake(0, searchBar.frame.size.height) - no pasa nada

Esto no funcionó: tableView.setContentOffset(CGPointMake(0, 44), animated: true); De nuevo, TableView estaba desplazándose demasiado, lo que resultó en que la fila 0 iba detrás de la barra de herramientas.

Esto funcionó parcialmente: tableView.setContentOffset(CGPointMake(0, 0) pero titleForHeaderInSection iba detrás de toolBar

ESTO tableView.setContentOffset(CGPointMake(0, -20) : tableView.setContentOffset(CGPointMake(0, -20)

Parece no lógico, pero solo -20 lo movió a la posición correcta


No agregue UISearchBar como una subvista de UITableView, esto no es necesario.

La UITableView tiene una propiedad tableHeaderView que es perfecta para esto:

- (void) viewDidLoad { [super viewDidLoad]; self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease]; self.searchBar.showsCancelButton = YES; self.searchBar.delegate = self; self.tableView.tableHeaderView = self.searchBar; }

Si no quieres verlo de manera predeterminada:

- (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView setContentOffset:CGPointMake(0, 44)]; }

También obtengo el botón cancelar para ocultarlo nuevamente ... (y quitar el teclado)

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES]; [self.searchBar resignFirstResponder]; }


No olvides tener en cuenta la barra de estado y la barra de navegación . Mi controlador de vista de tabla está incrustado en un controlador de navegación, en viewDidAppear :

tableView.contentOffset = CGPointMake(0, -20) // -20 = 44 (search bar height) - 20 (status bar height) - 44 (navigation bar height)

trabajó para mi.


Para Swift 3+

Hice esto:

Declara esta var :

var searchController = UISearchController()

Y en el método viewDidLoad()

searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.hidesNavigationBarDuringPresentation = false searchController.dimsBackgroundDuringPresentation = true searchController.searchBar.placeholder = NSLocalizedString("Search", comment: "") definesPresentationContext = true tableView.tableHeaderView = searchController.searchBar tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)


Para Swift:

Simplemente haga que el contenido y el desplazamiento de la tabla de visión sean iguales a la altura de la barra de búsqueda.

self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height)


Primero asegúrese de agregar UISearchBar a tableHeaderView de UITableView para que se desplacen con el contenido de la tabla y no se fije en la parte superior de la vista.

La barra de búsqueda no se cuenta como una fila en la vista de tabla, por lo que si desplaza la parte superior de la tabla vista a la primera fila, ''oculta'' la barra de búsqueda:

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

o en Swift:

yourTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)

Asegúrese de no desplazar la vista de tabla antes de que contenga datos ( scrollToRowAtIndexPath generará una excepción si el indexPath dado no apunta a una fila válida (es decir, si la tabla vista está vacía)).


Si su tabla siempre tendrá al menos una fila, simplemente desplácese a la primera fila de la tabla y la barra de búsqueda se ocultará automáticamente.

let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)

self.tableView.selectRowAtIndexPath (firstIndexPath, animated: false, scrollPosition: .Top)

Si coloca el código anterior en viewDidLoad , arrojará un error porque tableView aún no se ha cargado, por lo que debe colocarlo en viewDidAppear porque en este punto el tableView ya se ha cargado.

Si lo coloca en viewDidAppear , cada vez que abra tableView se desplazará a la parte superior.

Quizás no desee este comportamiento si el tableView permanece abierto, como cuando es un Controlador de vista UITabBar o cuando realiza un cambio y luego regresa. Si solo desea que se desplace hasta la parte superior de la carga inicial, puede crear una variable para comprobar si se trata de una carga inicial, de modo que se desplaza hacia la parte superior una sola vez.

Defina primero una variable llamada isInitialLoad en la clase del controlador de vista y configúrelo como "verdadero":

var isInitialLoad = true

Luego, compruebe si isititialload es verdadero en viewDidAppear y si es verdadero, desplácese hasta la parte superior y establezca la variable isInitialLoad en false:

if isInitialLoad { let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0) self.tableView.selectRowAtIndexPath(firstIndexPath, animated: false, scrollPosition: .Top) isInitialLoad = false }


Swift 3

¡también funciona con una mesa vacía!

En mi entorno, cargo células personalizadas por archivo xib y rowHeight se establece automáticamente.

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { self.tableView.contentOffset = CGPoint(x: 0, y: self.tableView.contentOffset.y + self.searchController.searchBar.bounds.height) }


Tenga en cuenta que la respuesta aceptada se bloqueará si no hay datos en la tabla vista. Y agregarlo a viewDidLoad puede no funcionar en ciertas circunstancias.

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; // crashes if no rows/data

Por lo tanto, en su lugar agregue esta línea de código:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [yourTableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height)]; }


Todas las soluciones existentes no funcionan para mí en iOS 8 cuando no hay suficientes filas para llenar TableView, ya que iOS ajustará el recuadro automáticamente en esta situación. (Las respuestas existentes son buenas cuando hay suficientes filas)

Después de desperdiciar como 6 horas en este tema, finalmente obtuve esta solución.

En resumen, debe insertar celdas vacías en TableView si no hay suficientes celdas, por lo que el tamaño del contenido de TableView es lo suficientemente grande como para que iOS no ajuste el recuadro por usted.

Así es como lo hice en Swift:

1.) declara una variable minimumCellNum como una propiedad de clase

var minimumCellNum: Int?

2.) calcular minimumCellNum y establecer tableView.contentOffset en viewWillAppear

let screenHeight = Int(UIScreen.mainScreen().bounds.height) // 101 = Height of Status Bar(20) + Height of Navigation Bar(44) + Height of Tab Bar(49) // you may need to subtract the height of other custom views from the screenHeight. For example, the height of your section headers. self.minimumCellNum = (screenHeight - 103 - heightOfOtherCustomView) / heightOfYourCell self.tableView.contentOffset = CGPointMake(0, 44)

3.) en tableView(tableView: UITableView, numberOfRowsInSection section: Int))

let numOfYourRows = YOUR LOGIC if numOfYourRows > minimumCellNum { return numOfYourRows } else { return minimumCellNum! }

4.) Registre una celda vacía, cuyo atributo de selection es None , en el guión gráfico y en tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)

if indexPath.row < numOfYourRows { return YOUR CUSTOM CELL } else { let cell = tableView.dequeueReusableCellWithIdentifier("EmptyCell", forIndexPath: indexPath) as! UITableViewCell return cell }

5.) en tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

if tableView == self.tableView { if numOfYourRows < (indexPath.row + 1) { return } YOUR LOGIC OF SELECTING A CELL }

Esta no es una solución perfecta, pero es la única solución que realmente funciona para mí en iOS 8. Me gustaría saber si hay una solución más ordenada.


Tuve un problema similar. Y la única forma que encontré para resolver este problema fue utilizar el observador de valores clave en la propiedad UITableView contentOffset.

Después de algunas depuraciones, me di cuenta de que el problema aparece solo si el tamaño del contenido de la vista de tabla es menor que la vista de tabla. Comienzo KVO cuando en viewWillAppear. Y el envío de parada KVO 0.3 segundos después de la vista aparece. Cada vez que contentOffset se convierte en 0.0, KVO reacciona y establece contentOffset en la altura de la barra de búsqueda. Dejo KVO asincrónico después de 0,3 segundos porque el diseño de vista restablecerá contentOffset incluso después de que aparezca la vista.

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil]; } -(void)viewDidAppear:(BOOL)animated{ __weak typeof (self) weakSelf = self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [weakSelf.tableView removeObserver:self forKeyPath:@"contentOffset"];}); } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"contentOffset"] && self.tableView.contentOffset.y == 0.0) { self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.tableView.tableHeaderView.frame)); } } -(void)dealloc { [self.tableView removeObserver:self forKeyPath:@"contentOffset"]; }