как изменить UISearchBar с круглого на прямоугольник? - PullRequest
8 голосов
/ 04 ноября 2011

Мне хотелось бы узнать, как мне нужно изменить UISearchBar с круглой кривой по умолчанию на прямоугольник.

enter image description here

enter image description here

Ответы [ 12 ]

19 голосов
/ 06 февраля 2012
    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
    }
  }
}
2 голосов
/ 22 октября 2014

Гораздо лучше на мой взгляд:

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.borderStyle = UITextBorderStyleNone;
2 голосов
/ 04 ноября 2011

UISearchBar имеет круглую кривую, и это исправлено, если вы хотите сделать его прямоугольником, вы должны использовать настраиваемую панель поиска с прямоугольным изображением, как у панели поиска и 1 uibutton и UItextfield, и собственную логику поиска

2 голосов
/ 04 ноября 2011

Просто добавьте фоновое изображение, вид слева и справа для вашего TextField.

Пример ниже

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 10., nameField.bounds.size.height)];
nameField.leftView = leftView;
nameField.leftViewMode = UITextFieldViewModeAlways;
leftView release];
1 голос
/ 16 февраля 2016

Почему бы не использовать протокол UIAppearance?

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

1 голос
/ 24 апреля 2013

На целевом изображении я не вижу тени по умолчанию, поэтому я упомяну, что установка свойства background на nil удалит его.Мне нужно было сделать это в моем проекте, и удаление изображения и манипулирование границей работает хорошо.Мне пришлось наложить элемент управления, чтобы получить свойство background .

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

@ Келлер, спасибо за подсказку по поиску элемента управления.

1 голос
/ 04 ноября 2011

Я бы использовал UIView со следующими функциями:
- установите рамку.
- импортируйте CoreGraphics в свой класс
- установить белый фон вида
- установить view.layer.cornerRadius=10;
- установить view.layer.borderWidth=8;
- установить view.layer.borderColor=[UIColor blackColor].CGColor;
- вставить метку (с чистым фоном) внутри созданного вида
Для кнопки слева я использовал бы изображение, для правой кнопки - textField.clearButtonMode= UITextFieldViewModeAlways;

Надеюсь, это поможет.

0 голосов
/ 09 января 2019

Способ, которым он работал со мной на Swift 4, заключается в создании подкласса UISearchBar и внесении необходимых корректировок там без какого-либо взлома или обходного пути ... Я использовал подкласс, использованный в этом уроке , ион работал как шарм

Вот код из примера

//
//  SearchBar.swift
//  Yomu
//
//  Created by Sendy Halim on 9/3/17.
//  Copyright © 2017 Sendy Halim. All rights reserved.
//

import Foundation
import UIKit

class SearchBar: UISearchBar {
  override func willMove(toSuperview newSuperview: UIView?) {
    super.willMove(toSuperview: newSuperview)

    searchBarStyle = .minimal

    // Create search icon
    let searchIcon = UIImageView(image: #imageLiteral(resourceName: "search"))
    let searchImageSize = searchIcon.image!.size
    searchIcon.frame = CGRect(x: 0, y: 0, width: searchImageSize.width + 10, height: searchImageSize.height)
    searchIcon.contentMode = UIViewContentMode.center

    // Configure text field
    let textField = value(forKey: "_searchField") as! UITextField
    textField.leftView = searchIcon
    textField.borderStyle = .none
    textField.backgroundColor = UIColor(hex: "#F7F7F7")
    textField.clipsToBounds = true
    textField.layer.cornerRadius = 6.0
    textField.layer.borderWidth = 1.0
    textField.layer.borderColor = textField.backgroundColor!.cgColor
    textField.textColor = UIColor(hex: "#555555")
  }
}
0 голосов
/ 06 июня 2017

Свифт 3

    let textFieldInsideUISearchBar = searchBar.value(forKey: "searchField") as? UITextField
    textFieldInsideUISearchBar?.borderStyle = .none
    textFieldInsideUISearchBar?.backgroundColor = UIColor.white
0 голосов
/ 22 июля 2015

Я также недавно достиг этого в проекте, обходя подпредставления объекта UISearchBar.Однако текстовое поле было не непосредственным ребенком, как предполагал принятый ответ, а подвидом другого подпредставления о нем.Внутренняя иерархия представления, вероятно, была изменена в какой-то момент.(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;
                }
            }
        }
    }
}

Этот метод не использует никаких недокументированных методов, поэтому он, вероятно, безопасен в App Store, хотя может перестать работать с будущими изменениями SDK.

...