Я тестирую свой пользовательский интерфейс, и я считаю, что панель поиска немного слишком узка по моему вкусу. Я также хочу, чтобы у людей с более низким зрением или меньшей ручной ловкостью не возникало проблем, связанных с желаемым интерфейсом.
Итак, что бы я хотел сделать, это отрегулировать высоту UITextfield
внутри UISearchbar
.
То, что я пробовал:
1. В Storyboard добавьте UISearchbar
Ограничение по высоте - Результаты: размер поисковой панели увеличивается, но UITextfield
внутри остается тем же.
- Получите доступ к
UITextfield
внутриUISearchbar
и измените его высоту. - Результаты: вывод консоли показывает, что параметр изменен, но на экране высотаUITextfield
остается прежней.
Примечание. Я могу изменить другие параметры UITextfield
, используя метод 2, и изменение отразится на экране, поэтому я знаю, что добираюсь до UITextfield
Код для метода 2, поместите в viewDidLoad() ViewController, где находится UISearchbar:
for tempView in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView]
{
if let tV = tempView as? UITextField
{
var currentFrameRect = tV.frame
currentFrameRect.size.height = 80
//tV.layer.backgroundColor = UIColor.blueColor().CGColor //This works fine
//tV.layer.cornerRadius = 5 //This works fine
//tV.font = UIFont(name: "Courier", size: 40) //This works fine
println(tV.frame.height) //console output:0.0
tV.frame = currentFrameRect
println(tV.frame) //console output:(0.0, 0.0, 0.0, 80.0)
println(currentFrameRect) //console output:(0.0, 0.0, 0.0, 80.0) - redundant, just checking
println(tV.frame.height) //console output:80.0 - it says 80, but screen shows searchbar definitely not 80.
}
}
Я думаю, что это имеет какое-то отношение к автозапуску, так или иначе способному игнорировать параметры независимо от того, где он установлен. Я хотел бы продолжать использовать автозапуск, так как он много работает для меня, но я бы хотел, чтобы он вел себя так, как в Storyboard, где, когда пользователь устанавливает настройку, он будет использовать эти параметры в своем автозапуске и жаловаться, t, а не просто игнорировать настройку без обратной связи.
Edit:
В ответ на Махеша. Я не знаю много объективного С++, но я изо всех сил пытался преобразовать то, что вы написали, в быстром. Это то, что у меня есть:
(Внутри моего viewcontroller.swift)
func viewDIdLayoutSubviews()
{
super.viewDidLayoutSubviews()
self.roomInfoSearchBar.layoutSubviews()
var topPadding: Float = 5.0
for view in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView]
{
if let tfView = view as? UITextField
{
var calcheight = self.roomInfoSearchBar.frame.size.height - 10
tfView.frame = CGRectMake(tfView.frame.origin.x, CGFloat(topPadding), tfView.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2))
}
}
}
Я сохранил свой код для доступа к текстовому полю, так как у меня возникли проблемы с преобразованием кода в быстрый. Для CGRectMake - swift жаловался на различные типы, в том числе, что topPadding не был CGFloat, а для последней переменной (размер Y) снова не нравилось смешивать CGFloat с Float, поэтому мне тоже пришлось это изменить.
К сожалению, он не работает. Я изменил высоту UISearchbar до 80 в раскадровке, и у меня появилась очень высокая панель поиска с текстовым полем, охватывающим около 1/3 от общей высоты.
Изменить # 2: Включить Yuyutsu и скорректированную версию кода Mahesh.
Все еще не идеально, но ближе. Код Yuyutsu работает, но, как упоминалось в моих комментариях, поле не центрируется, изменение размера также видно (прыгать с высоты A на высоту B), когда представление сначала загружается. Еще один недостаток заключается в том, что, поскольку изменение размера выполняется при viewDidAppear
после изменения ориентации, поле возвращается к внутреннему размеру.
Мой код, основанный на Yuyutsu's:
override func viewDidAppear(animated: Bool)
{
super.viewDidAppear(animated)
var roomInfoSearchBarFrame = roomInfoSearchBar.frame
var newHeight: CGFloat = 60
for subView in roomInfoSearchBar.subviews
{
for subsubView in subView.subviews
{
if let textField = subsubView as? UITextField
{
var currentTextFieldFrame = textField.frame
var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2
var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight)
textField.frame = newTextFieldFrame
textField.borderStyle = UITextBorderStyle.RoundedRect
textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
//textField.backgroundColor = UIColor.redColor()
// textField.font = UIFont.systemFontOfSize(20)
}
}
}
}
Глядя на код Yuyutsu, я хотел знать, где еще я мог бы установить эту настройку, и я наткнулся на ссылку через другую запись stackoverflow. Основываясь на том, что я читал, я увидел, что ответ Махеша должен работать. Вот где я понял, почему он не работает - мне нужно было переопределить func viewWillLayoutSubviews()
.
Текущий код: сохраняет размер с изменением ориентации. Но скачок размера остается видимым (его не должно быть видно)
override func viewWillLayoutSubviews()
{
super.viewWillLayoutSubviews()
var roomInfoSearchBarFrame = roomInfoSearchBar.frame
var newHeight: CGFloat = 60
for subView in roomInfoSearchBar.subviews
{
for subsubView in subView.subviews
{
if let textField = subsubView as? UITextField
{
var currentTextFieldFrame = textField.frame
var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2
var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight)
textField.frame = newTextFieldFrame
textField.borderStyle = UITextBorderStyle.RoundedRect
textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
//textField.backgroundColor = UIColor.redColor()
// textField.font = UIFont.systemFontOfSize(20)
}
}
}
}
Итак, прямо сейчас осталось только попытаться сделать так, чтобы текстовое поле было установленным размером до того, как вид был видимым, поэтому нет сдвига по размеру, который видим пользователю.
Final Edit: Полностью рабочий код С дополнительной помощью Yuyutsu код ниже делает все, что я хочу - начинается с заданного размера, поле центрируется, отлично работает с вращением.
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
self.roomInfoSearchBar.layoutIfNeeded()
self.roomInfoSearchBar.layoutSubviews()
var roomInfoSearchBarFrame = roomInfoSearchBar.frame
var newHeight: CGFloat = 60 //desired textField Height.
for subView in roomInfoSearchBar.subviews
{
for subsubView in subView.subviews
{
if let textField = subsubView as? UITextField
{
var currentTextFieldBounds = textField.bounds
currentTextFieldBounds.size.height = newHeight
textField.bounds = currentTextFieldBounds
textField.borderStyle = UITextBorderStyle.RoundedRect
//textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
}
}
}
}
Спасибо Yuyutsu. Спасибо Mahesh за то, что он придумал окончательное решение с самого начала, просто пропустил несколько критических бит.