Ich teste meine Benutzeroberfläche aus und finde die Suchleiste für meinen Geschmack etwas zu eng. Ich möchte auch sicherstellen, dass Menschen mit schlechterer Sehkraft oder schlechterer Fingerfertigkeit keine Probleme haben, die gewünschte Schnittstelle zu entwickeln.Kann die Höhe des Textfeldes UISearchbar geändert werden?
Also, was ich tun möchte, ist die Höhe der UITextfield
innerhalb UISearchbar
.
Was ich versucht habe: 1. In Storyboard, fügen UISearchbar
Höhe Einschränkung - Ergebnisse: die searchbar Größe zunimmt, aber die UITextField
innen bleibt gleich.
- Zugang der
UITextField
innerhalbUISearchbar
und seine Höhe ändern - Ergebnisse: Die Konsolenausgabe zeigt, dass die Parameter geändert, aber auf dem Bildschirm bleibt dieUITextField
Höhe gleich.
Hinweis - kann ich andere Parameter der UITextField
ändern mit der Methode 2 und die Änderung auf dem Bildschirm reflektiert wird, damit ich weiß, ich bin immer auf den UITextField
-Code für Methode 2, setzte in viewDidLoad() von Viewcontroller wo UISearchBar befindet:
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.
}
}
denke ich, es hat etwas mit automatischem Layout irgendwie in der Lage sein zu ignorieren Parameter unabhängig davon, wo sie gesetzt zu tun hat. Ich möchte weiterhin das automatische Layout verwenden, da es viel Arbeit für mich bedeutet, aber ich wünschte, es würde sich wie im Storyboard verhalten. Wenn ein Benutzer eine Einstellung vornimmt, verwendet er diese Parameter in seinem automatischen Layout und beschwört, wenn es möglich ist. t im Gegensatz zu ignorieren nur die Einstellung ohne Feedback.
Edit:
Als Reaktion auf Mahesh. Ich weiß nicht viel objektives C++, aber ich habe mein Bestes versucht, um das, was Sie geschrieben haben, in swift zu konvertieren. Das ist, was ich habe:
(Inside my 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))
}
}
}
Ich habe meinen Code gehalten, um das Textfeld bekommen, seit ich hatte einige Probleme, Ihren Code zu rascher Umwandlung. Für die CGRectMake - Swift beschwerte sich über verschiedene Typen einschließlich topPadding war kein CGFloat und für die letzte Variable (Y-Größe), wieder mochte es nicht CGFloat mit Float zu mischen, also musste ich das auch ändern.
Leider scheint es nicht zu funktionieren. Ich habe die UISearchbar-Höhe im Storyboard auf 80 geändert und ich habe gerade eine sehr große Suchleiste mit einem Textfeld, das ungefähr 1/3 der Gesamthöhe bedeckt.
Edit # 2: Incorporating Yuyutsu und korrigierte Version von Mahesh-Code. Noch nicht perfekt, aber näher. Der Code von Yuyutsu funktioniert, aber wie in meinen Kommentaren erwähnt, ist das Feld nicht zentriert, die Größenänderung ist auch sichtbar (Sprung von Höhe A nach Höhe B), wenn die Ansicht zuerst geladen wird. Ein weiterer Mangel besteht darin, dass das Feld zur ursprünglichen Größe zurückkehrt, da die Größenänderung bei viewDidAppear
erfolgt, sobald sich die Ausrichtung ändert.
Mein Code basiert auf Yuyutsu suchen:
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)
}
}
}
}
im Code des Yuyutsu Suche ich ich wo sonst wissen wollte diese Einstellung setzen könnte und ich kam in link über eine andere Stackoverflow Post. Basierend auf dem, was ich gelesen habe, sah ich, dass Maheshs Antwort funktionieren sollte. Dies ist, wo ich erkannte, warum es nicht funktionierte - ich brauchte überschreiben func viewWillLayoutSubviews()
.
Aktueller Code: Hält die Größe bei Änderung der Ausrichtung. Aber Größe Sprung noch sichtbar (es soll nicht sichtbar sein)
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)
}
}
}
}
So jetzt, das einzige, was links ist zu versuchen, und macht es so das Textfeld ist die Menge Größe vor der Ansicht sichtbar, so ist Es gibt keine Größenänderung, die für den Benutzer sichtbar ist.
Finale Edit: Voll funktionierende Code Mit Yuyutsu die zusätzliche Hilfe, Code unten ist alles, was ich will - beginnt mit der eingestellten Größe aus, Feld zentriert ist, beschäftigt sich mit der Rotation in Ordnung.
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
}
}
}
}
Dank Yuyutsu. Danke, dass Mahesh von Anfang an so ziemlich die endgültige Lösung gefunden hat und nur ein paar kritische Bits vermisst hat.
Das Finale kann mit Mahesh Idee der Polsterung noch bequemer sein. Im Wesentlichen berechnen Sie "newHeight" basierend auf "roomInfoSearchBar.frame" subtrahieren Sie 2 * somePadding (wobei einigePadding der gewünschte Platz zwischen searchField und dem textField ist). Sobald Sie das eingestellt haben, können Sie die Größe der searchBar im Storyboard anpassen und das Textfeld wird ebenfalls angepasst. Sie müssen nur die 'viewDidLayoutSubviews()' ändern, wenn Sie die Auffüllung ändern möchten. – janson
Die wirklich beste Lösung ist es, 'UITextField' zu verwenden und einfach das Lupenbild zu seinem' leftView' hinzuzufügen. Wirklich, Sie werden eine Menge Probleme lösen, die durch das Hacken in "UISearchBar" verursacht werden. – Sulthan