как изменить UISearchBar с круглого на прямоугольное?

#iphone #ios #uisearchbar

#iPhone #iOS #uisearchbar

Вопрос:

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

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

     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
    }
  }
}
  

Комментарии:

1. Затем вы можете управлять радиусом угла с помощью searchBarTextField. layer.cornerRadius = 5.0;

2. если ([searchBarSubview respondsToSelector:@sel (setBorderStyle)])` [(UITextField *)searchBarSubview setBorderStyle:UITextBorderStyleRoundedRect];`

3. Теперь день, когда я, вероятно, использовал бы [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBorderStyle:UITextBorderStyleRoundedRect];

4. Безопасно ли это решение в app Store?

Ответ №2:

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

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

Ответ №3:

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

Пример ниже

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

Ответ №4:

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

Ответ №5:

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

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

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

Ответ №6:

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

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

Комментарии:

1. похоже, это сложно, я думаю, я оставлю все как есть. если у вас это сработает, дайте мне знать. спасибо 🙂

Ответ №7:

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

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

Ответ №8:

В нашем предыдущем проекте мы также пытались реализовать таким образом, но настройка невозможна.

Ответ №9:

Не могли бы вы попробовать это.

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

Ответ №10:

Я также недавно добился этого в проекте, пройдя по подвидам объекта 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.

Ответ №11:

Swift 3

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

Комментарии:

1. @Pierre.Vriens какая строка?

2. @Pierre.Vriens посмотрите на принятый комментарий, объяснять не нужно. просто скопируйте и вставьте в свой UIViewController.

Ответ №12:

Способ, которым это работало со мной на 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")
  }
}