example bar swift autolayout uisearchbar

swift - example - ¿Se puede modificar la altura de UISearchbar TextField?



uisearchbardelegate (5)

Estoy probando mi UI y encuentro que la barra de búsqueda es un poco demasiado estrecha para mi gusto. También quiero asegurarme de que las personas con visión deficiente o destreza manual deficiente no tengan problemas para abrir la interfaz que desean.

Entonces, lo que me gustaría hacer es ajustar la altura del UITextfield dentro de UISearchbar .

Lo que he intentado: 1. En Storyboard, agregue la restricción UISearchbar Height - Results: el tamaño de la barra de búsqueda aumenta, pero el UITextField dentro permanece igual.

  1. Acceda al UITextField dentro de UISearchbar y modifique su altura - Resultados: la salida de la consola muestra que el parámetro se ha modificado, pero en la pantalla, la altura de UITextField sigue siendo la misma.

Nota - Puedo modificar otros parámetros de UITextField usando el método 2 y el cambio se refleja en la pantalla, así que sé que estoy llegando al UITextField

Código para el Método 2, coloque en viewDidLoad () de ViewController donde se encuentra UISearchbar:

for tempView in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView] { if let tV = tempView as? UITextField { var currentFrameRect = tV.frame currentFrameRect.size.height = 80 //tV.layer.backgroundColor = UIColor.blueColor().CGColor //This works fine //tV.layer.cornerRadius = 5 //This works fine //tV.font = UIFont(name: "Courier", size: 40) //This works fine println(tV.frame.height) //console output:0.0 tV.frame = currentFrameRect println(tV.frame) //console output:(0.0, 0.0, 0.0, 80.0) println(currentFrameRect) //console output:(0.0, 0.0, 0.0, 80.0) - redundant, just checking println(tV.frame.height) //console output:80.0 - it says 80, but screen shows searchbar definitely not 80. } }

Creo que tiene algo que ver con el autolayout, que de alguna manera puede ignorar los parámetros, independientemente de dónde esté configurado. Me gustaría seguir utilizando el diseño automático, ya que me ayuda mucho, pero me gustaría que se comportara como en Storyboard, donde cuando un usuario establece una configuración, utiliza esos parámetros en su diseño automático y se queja cuando puede ". t en lugar de simplemente ignorar la configuración sin comentarios.

Editar:

En respuesta a Mahesh. No sé mucho de C ++ objetivo, pero hice todo lo posible para convertir rápidamente lo que escribiste. Esto es lo que tengo:

(Dentro de mi viewcontroller.swift)

func viewDIdLayoutSubviews() { super.viewDidLayoutSubviews() self.roomInfoSearchBar.layoutSubviews() var topPadding: Float = 5.0 for view in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView] { if let tfView = view as? UITextField { var calcheight = self.roomInfoSearchBar.frame.size.height - 10 tfView.frame = CGRectMake(tfView.frame.origin.x, CGFloat(topPadding), tfView.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2)) } } }

He conservado mi código para acceder al campo de texto porque tuve algunos problemas al convertir tu código rápidamente. Para CGRectMake, swift se quejó de varios tipos, incluyendo que topPadding no era un CGFloat y para la última variable (tamaño Y), una vez más no me gustó mezclar CGFloat con Float, así que tuve que cambiar eso también.

Desafortunadamente, no parece funcionar. Cambié la altura de UISearchbar a 80 en el guión gráfico y acabo de obtener una barra de búsqueda muy alta con el campo de texto que cubre aproximadamente 1/3 de la altura total.

Editar # 2: Incorporando Yuyutsu y la versión corregida del código de Mahesh. Todavía no es perfecto, pero está más cerca. El código de Yuyutsu funciona, pero como mencioné en mis comentarios, el campo no se centra, el cambio de tamaño también es visible (salta de la altura A a la altura B) cuando la vista se carga por primera vez. Una deficiencia adicional es que debido a que el cambio de tamaño se realiza en viewDidAppear una vez que la orientación cambia, el campo vuelve al tamaño intrínseco.

Mi código basado en Yuyutsu:

override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) var roomInfoSearchBarFrame = roomInfoSearchBar.frame var newHeight: CGFloat = 60 for subView in roomInfoSearchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var currentTextFieldFrame = textField.frame var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2 var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight) textField.frame = newTextFieldFrame textField.borderStyle = UITextBorderStyle.RoundedRect textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight //textField.backgroundColor = UIColor.redColor() // textField.font = UIFont.systemFontOfSize(20) } } } }

Al mirar el código de Yuyutsu, quería saber dónde más podría poner este ajuste y encontré el enlace a través de otra publicación de stackoverflow. Basado en lo que leí, vi que la respuesta de Mahesh debería funcionar. Aquí es donde me di cuenta de por qué no estaba funcionando. Necesitaba anular func viewWillLayoutSubviews() .

Código actual: Mantiene el tamaño con el cambio de orientación. Pero el salto de tamaño sigue siendo visible (no debería ser visible)

override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() var roomInfoSearchBarFrame = roomInfoSearchBar.frame var newHeight: CGFloat = 60 for subView in roomInfoSearchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var currentTextFieldFrame = textField.frame var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2 var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight) textField.frame = newTextFieldFrame textField.borderStyle = UITextBorderStyle.RoundedRect textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight //textField.backgroundColor = UIColor.redColor() // textField.font = UIFont.systemFontOfSize(20) } } } }

Entonces, en este momento, lo único que queda es tratar de hacerlo para que el campo de texto sea el tamaño establecido antes de que la vista sea visible, de modo que no haya un cambio de tamaño visible para el usuario.

Edición final: código completamente funcional Con la ayuda adicional de Yuyutsu, el código siguiente hace todo lo que quiero: comienza en el tamaño establecido, el campo está centrado, se ocupa de la rotación fina.

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.roomInfoSearchBar.layoutIfNeeded() self.roomInfoSearchBar.layoutSubviews() var roomInfoSearchBarFrame = roomInfoSearchBar.frame var newHeight: CGFloat = 60 //desired textField Height. for subView in roomInfoSearchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var currentTextFieldBounds = textField.bounds currentTextFieldBounds.size.height = newHeight textField.bounds = currentTextFieldBounds textField.borderStyle = UITextBorderStyle.RoundedRect //textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight } } } }

Gracias Yuyutsu. Gracias a Mahesh por encontrar la solución final desde el principio, solo faltan algunos bits críticos.


Puede cambiar la altura del campo de texto interno pruebe este código.

paso 1) establezca la restricción para aumentar su altura de UISearchBar, luego realice la salida de la barra de búsqueda y escriba este código en el controlador de visualización.

- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.searchBar layoutSubviews]; float topPadding = 5.0; for(UIView *view in self.searchBar.subviews) { for(UITextField *textfield in view.subviews) { if ([textfield isKindOfClass:[UITextField class]]) { textfield.frame = CGRectMake(textfield.frame.origin.x, topPadding, textfield.frame.size.width, (self.searchBar.frame.size.height - (topPadding * 2))); } } } }

también si desea cambiar algo más en la barra de búsqueda, entonces puede encontrar el elemento base exacto como UILabel , UIImage y UIView dentro de las subvistas UITextField y también puede cambiar el marco y la imagen y otras propiedades . Gracias.

EDITAR:

como preguntaste rápidamente, lo escribo rápido. Creo que estás intentando algo mal. por favor prueba esto

func viewDIdLayoutSubviews() { super.viewDidLayoutSubviews() self.roomInfoSearchBar.layoutSubviews() var topPadding: Float = 5.0 for view in self.roomInfoSearchBar.subviews as [UIView] { for viewNew in view.subviews as [UIView] { if viewNew.isKindOfClass(UITextField) { viewNew.frame = CGRectMake(viewNew.frame.origin.x, CGFloat(topPadding), viewNew.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2)) } } } }

tomó la vista de índice 0 como la primera y la última vista para encuadrar. Creo que ese es el problema que el código que tradujo no funcionó. Pruebe una vez y por favor responda.


override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) for subView in searchBars.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var bounds: CGRect bounds = textField.frame bounds.size.height = 35 //(set height whatever you want) textField.bounds = bounds textField.borderStyle = UITextBorderStyle.RoundedRect // textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight textField.backgroundColor = UIColor.redColor() // textField.font = UIFont.systemFontOfSize(20) } } } }

Esto podría ayudarte :)


Si utiliza :

func setSearchFieldBackgroundImage(backgroundImage: UIImage?, forState state: UIControlState)

La altura del UITExtfield de UISearchBar sería la misma que la altura de la Imagen.

Puede colocar una Imagen, usarla para personalizar la altura UITextfield de UISearchBar y backgroundImage.

O puede utilizar la función siguiente para crear un UIImage de esquina redonda:

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { let rect = CGRectMake(0, 0, size.width, size.height) let path = UIBezierPath(roundedRect: rect, cornerRadius: 5.0) UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() path.fill() let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image }

El ancho del UIImage se ignora. Pero para tener un radio de esquina, es mejor que 10.0 .

El código sería así:

let image = self.getImageWithColor(UIColor.lightGrayColor(), size: CGSizeMake(20, 20)) searchBar.setSearchFieldBackgroundImage(image, forState: .Normal)


A veces he encontrado la respuesta aceptada como incorrecta.
Así es como he resuelto el problema de tener una altura personalizada para la barra de búsqueda: he establecido una imagen en color con el tamaño que quiero y la he agregado al campo de texto de la barra de búsqueda en viewDidLoad :

let image = getImageWithColor(UIColor.whiteColor(), size: CGSizeMake(600, 60)) searchBar.setSearchFieldBackgroundImage(image, forState: .Normal)

Seguido con esta función tomada de aquí

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { var rect = CGRectMake(0, 0, size.width, size.height) UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() UIRectFill(rect) var image: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image }


Agregue la restricción de altura a la barra de búsqueda en la vista del guión gráfico.

Esta instantánea lo hace fácil de entender.