ios uisearchbar spacing

ios - La configuración de la imagen de fondo del campo de búsqueda de UISearchBar cambia el relleno



spacing (3)

Es extraño que lo reinicie, sin embargo, puedes usar algo como esto para configurarlo a tu gusto después de configurar la imagen de fondo. searchTextPositionAdjustment es una propiedad en UISearchBar y funciona perfectamente. 8.0 parece ser el valor predeterminado, pero puedes configurarlo para lo que quieras.

[self.searchBar setSearchFieldBackgroundImage:[self imageWithColor:[UIColor grayColor] andSize:CGSizeMake(28.0, 28.0)] forState:UIControlStateNormal]; [self.searchBar setSearchTextPositionAdjustment:UIOffsetMake(8.0, 0.0)];

Cuando configuro una imagen de fondo del campo de búsqueda en un UIImage , el relleno entre la lupa y el texto del marcador de posición en la barra de búsqueda cuando se selecciona cambia.

Con el fondo por defecto:

Con un fondo personalizado:

Este cambio es causado por estas dos líneas:

UIImage *colorImage = [UIImage imageWithColor:[UIColor grayColor] size:CGSizeMake(28, 28)]; [self setSearchFieldBackgroundImage:[colorImage imageWithRoundedCorners:5] forState:UIControlStateNormal];

imageWithRoundedCorners: es un método de categoría que simplemente dibuja la imagen en un CALayer con un radio de esquina y luego crea un UIImage desde el contexto de los gráficos.

¿Por qué es esto y cómo puedo evitar esto? Intenté pasar una imagen explícitamente redimensionable, pero eso no tuvo ningún efecto.


Para todos aquellos que ahora usan Swift, puedes usar el siguiente código (funciona en Swift 2)

let searchBarBackground = UIImage.roundedImage(UIImage.imageWithColor(UIColor.whiteColor(), size: CGSize(width: 28, height: 28)),cornerRadius: 2) searchBar.setSearchFieldBackgroundImage(searchBarBackground, forState: .Normal) searchBar.searchTextPositionAdjustment = UIOffsetMake(8.0, 0.0)

Use esto con una extensión a UIImage:

extension UIImage { class func imageWithColor(color: UIColor, size: CGSize) -> UIImage { let rect: CGRect = CGRectMake(0, 0, size.width, size.height) UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() UIRectFill(rect) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } class func roundedImage(image: UIImage, cornerRadius: Int) -> UIImage { let rect = CGRect(origin:CGPoint(x: 0, y: 0), size: image.size) UIGraphicsBeginImageContextWithOptions(image.size, false, 1) UIBezierPath( roundedRect: rect, cornerRadius: CGFloat(cornerRadius) ).addClip() image.drawInRect(rect) return UIGraphicsGetImageFromCurrentImageContext() } }

Para dar algo parecido a esto:


Solución actualizada para Swift 4

searchTextPositionAdjustment = UIOffset(horizontal: 8.0, vertical: 0.0)