2011-11-04 6 views

Respuesta

19
for (UIView *searchBarSubview in [mySearchBar subviews]) { 
     if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) { 
      @try { 

       [(UITextField *)searchBarSubview setBorderStyle:UITextBorderStyleRoundedRect]; 
      } 
      @catch (NSException * e) { 
       // ignore exception 
      } 
     } 
    } 

Swift 4:

mySearchBar.subviews().forEach { searchBarSubview in 
    if searchBarSubview is UITextInputTraits { 
    do { 
     (searchBarSubview as? UITextField)?.borderStyle = .roundedRect 
    } catch { 
     // ignore exception 
    } 
    } 
} 
+0

sí esto funciona !!!!! gracias @keller – Desmond

+0

Luego puedes controlar el radio de la esquina con searchBarTextField.layer.cornerRadius = 5.0; – esbenr

+0

si ([searchBarSubview respondsToSelector: @sel (setBorderStyle)]) ' [(UITextField *) searchBarSubview setBorderStyle: UITextBorderStyleRoundedRect];' –

2

imagen adicional, un fondo simple vista y la visión correcta para su campo de texto a la izquierda.

Ejemplo a continuación

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 10., nameField.bounds.size.height)]; 
nameField.leftView = leftView; 
nameField.leftViewMode = UITextFieldViewModeAlways; 
leftView release]; 
+1

campo de texto de dónde? – Desmond

0

En nuestro proyecto anterior que también trató de poner en práctica en la forma, pero la personalización no es posible.

+0

no hay manera de hacerlo? – Desmond

2

UISearchBar tiene la curva redonda, y se fijan si te gusta para que sea rectángulo que tiene que utilizar la barra de búsqueda personalizada imagen rectangular con tan como de la barra de búsqueda y 1 UIButton y UITextField, y su propia lógica de búsqueda

1

Yo usaría un UIView, con estas características:
- configure su marco.
- CoreGraphics de importación en su clase
- establecer un fondo blanco de la vista
- establecen view.layer.cornerRadius=10;
- establecen view.layer.borderWidth=8;
- establecen view.layer.borderColor=[UIColor blackColor].CGColor;
- insertar una etiqueta (con un fondo claro) dentro de la vista creada
Para el botón de la izquierda usaría una uiimage, para el botón derecho configurado textField.clearButtonMode= UITextFieldViewModeAlways;

Espero que esto ayude.

+0

Parece que es difícil, creo que lo dejaré como está. si funciona para usted, hágamelo saber. gracias :) – Desmond

1

En la imagen de destino no veo la sombra por defecto, por lo que voy a mencionar que el establecimiento de la propiedadfondo a cero se eliminará. Necesitaba hacer esto en mi proyecto y eliminar la imagen y manipular el borde funciona bien. Tuve que lanzar el control para llegar a la propiedad de fondo.

UITextField * x = (UITextField*)searchBarSubview; 
x.background = nil; 

@Keller gracias por la sugerencia para encontrar el control.

0

Podría intentar esto.

for (UIView *searchBarSubview in [search_bar subviews]) { 
     if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) { 
      if([searchBarSubview isKindOfClass:[UITextField class]]) 
      { 
       [(UITextField *)searchBarSubview setBorderStyle:UITextBorderStyleRoundedRect]; 
      } 
     } 
    } 
2

mucho mejor en mi opinión:

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"]; 
txfSearchField.borderStyle = UITextBorderStyleNone; 
0

También logrado recientemente esto en un proyecto por la que atraviesa los subvistas del objeto UISearchBar. Sin embargo, el campo de texto no era un elemento secundario como se sugirió la respuesta aceptada, sino una subvista de otra subvista. La jerarquía de visión interna probablemente se modificó en algún momento. (SDK 8.4)

+ (void)setSearchBar:(UISearchBar *)searchBar cornerRadius:(CGFloat)radius { 
    //set searchbar corner radius 
    for(UIView *possibleSearchBarTextFieldSuperview in [searchBar subviews]) { 
     if([[possibleSearchBarTextFieldSuperview subviews] count] > 0) { 
      for(UIView *possibleInnerSearchBarTextField in [possibleSearchBarTextFieldSuperview subviews]) { 
       if([possibleInnerSearchBarTextField conformsToProtocol:@protocol(UITextInputTraits)]) { 
        possibleInnerSearchBarTextField.layer.cornerRadius = radius; 
        possibleInnerSearchBarTextField.layer.masksToBounds = YES; 
        return; 
       } 
      } 
     } 
    } 
} 

Este método no utiliza ningún método de indocumentados por lo que es probable que tienda de aplicaciones de seguridad, aunque es susceptible a dejar de trabajar con los futuros cambios en el SDK.

0

¿Por qué no utilizar el protocolo UIAppearance?

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBorderStyle:UITextBorderStyleRoundedRect];

0

Swift 3

let textFieldInsideUISearchBar = searchBar.value(forKey: "searchField") as? UITextField 
    textFieldInsideUISearchBar?.borderStyle = .none 
    textFieldInsideUISearchBar?.backgroundColor = UIColor.white 
+0

@ Pierre.Vriens ¿en qué línea? –

+0

Todos ellos. En otras palabras: simplemente publicando "algún código" sin explicación en absoluto, comúnmente se percibe como una respuesta de alta calidad. Así que tal vez quieras explicar brevemente cómo el código que publicaste ayuda a responder la pregunta. ¡Buena suerte! –

+0

@ Pierre.Vriens mira el comentario aceptado, no es necesario explicarlo. simplemente copie y pegue en su UIViewController. –