#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")
}
}