Ich teste meine Benutzeroberfläche und finde die Suchleiste für meinen Geschmack etwas zu eng. Ich möchte auch sicherstellen, dass Menschen mit schlechterer Sicht oder schlechterer manueller Geschicklichkeit keine Probleme mit der gewünschten Schnittstelle haben.
Ich möchte also die Höhe der UITextfield
in UISearchbar
anpassen.
Was ich versucht habe: 1. Fügen Sie im Storyboard UISearchbar
Height-Einschränkung hinzu - Ergebnisse: Die Größe der Suchleiste wird erhöht, aber die Variable UITextField
bleibt unverändert.
UITextField
in UISearchbar
zu und ändern Sie die Höhe. - Ergebnisse: Die Konsolenausgabe zeigt an, dass der Parameter geändert wurde. Auf dem Bildschirm bleibt die Höhe von UITextField
jedoch gleich.Hinweis - Ich kann andere Parameter der UITextField
mit Methode 2 ändern. Die Änderung wird auf dem Bildschirm angezeigt. Ich weiß, dass ich zur UITextField
komme.
Code für Methode 2, in viewDidLoad () von ViewController, wo sich die 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.
}
}
Ich denke, es hat etwas mit Autolayout zu tun, dass man Parameter irgendwie ignorieren kann, egal wo es eingestellt ist. Ich möchte Autolayout weiterhin verwenden, da es für mich eine Menge Arbeit leistet, aber ich wünschte, es würde sich so verhalten wie in Storyboard. Wenn ein Benutzer eine Einstellung festlegt, verwendet er diese Parameter in seinem Autolayout und beschwert sich, wenn dies möglich ist. Im Gegensatz dazu, die Einstellung ohne Rückmeldung zu ignorieren.
Bearbeiten:
Als Antwort auf Mahesh. Ich weiß nicht viel über Objective C++, aber ich habe mein Bestes versucht, das, was Sie geschrieben haben, in Swift umzuwandeln. Das ist was ich habe:
(In meinem 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 für das Aufrufen des Textfelds beibehalten, seit ich Probleme mit der Konvertierung Ihres Codes in Swift hatte. Für CGRectMake - Swift klagte verschiedene Typen, darunter TopPadding war kein CGFloat und für die letzte Variable (Größe Y) mochte CGFloat nicht mit Float, daher 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 erhalten, das etwa 1/3 der Gesamthöhe abdeckt.
Edit # 2: Einbindung von Yuyutsu und korrigierte Version des Mahesh-Codes. Noch nicht perfekt, aber näher. Yuyutsus Code funktioniert, aber wie in meinen Kommentaren erwähnt, zentriert sich das Feld nicht, die Größenänderung ist auch sichtbar (Sprung von Höhe A zu Höhe B), wenn die Ansicht zum ersten Mal geladen wird. Ein weiterer Nachteil besteht darin, dass das Feld auf die intrinsische Größe zurückgesetzt wird, da die Größenänderung bei viewDidAppear
erfolgt, sobald sich die Ausrichtung ändert.
Mein Code basierend auf Yuyutsu:
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)
}
}
}
}
Als ich mir Yuyutsus Code ansah, wollte ich wissen, wo ich diese Anpassung noch vornehmen könnte, und ich bin über einen anderen Stackoverflow-Post auf link gestoßen. Basierend auf dem, was ich las, sah ich, dass Maheshs Antwort funktionieren sollte. Hier wurde mir klar, warum es nicht funktionierte - ich musste override func viewWillLayoutSubviews()
.
Aktueller Code: Behält die Größe bei Änderung der Ausrichtung bei. Der Größensprung bleibt jedoch sichtbar (sollte 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)
}
}
}
}
Jetzt muss man nur noch versuchen, es so zu gestalten, dass das Textfeld die festgelegte Größe ist, bevor die Ansicht sichtbar ist, sodass keine Größenverschiebung für den Benutzer sichtbar ist.
Final Edit: Voll funktionsfähiger Code Mit der zusätzlichen Hilfe von Yuyutsu erledigt der folgende Code alles, was ich will - beginnt mit der eingestellten Größe, das Feld ist zentriert und behandelt die Rotation.
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
}
}
}
}
Danke Yuyutsu . Vielen Dank Mahesh, dass er von Anfang an so ziemlich mit der endgültigen Lösung zu tun hatte, dass er nur ein paar kritische Teile verpasst hat.
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
for subView in searchBars.subviews {
for subsubView in subView.subviews {
if let textField = subsubView as? UITextField {
var bounds: CGRect
bounds = textField.frame
bounds.size.height = 35 //(set height whatever you want)
textField.bounds = bounds
textField.borderStyle = UITextBorderStyle.RoundedRect
// textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
textField.backgroundColor = UIColor.redColor()
// textField.font = UIFont.systemFontOfSize(20)
}
}
}
}
Das könnte dir helfen :)
Wenn du benutzt :
func setSearchFieldBackgroundImage(backgroundImage: UIImage?, forState state: UIControlState)
Die Höhe des UISearchBar-Felds "UIText" entspricht der Höhe des Bildes.
Sie können ein Bild ablegen und es verwenden, um die Höhe des UITextfield-Felds und das backgroundImage von UISearchBar anzupassen.
Oder Sie können die Funktion unten verwenden, um ein UIImage mit runder Ecke zu erstellen:
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRectMake(0, 0, size.width, size.height)
let path = UIBezierPath(roundedRect: rect, cornerRadius: 5.0)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
path.fill()
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
Die Breite des UIImage wird ignoriert. Aber um einen Eckenradius zu haben, ist er besser als 10.0
.
Der Code würde folgendermaßen aussehen:
let image = self.getImageWithColor(UIColor.lightGrayColor(), size: CGSizeMake(20, 20))
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal)
Dies ist die richtige Swift 4.0 Antwort zum Ändern der Höhe einer UISearchBar:
let image = getImageWithColor(color: UIColor.clear, size: CGSize(width: 1, height: 40))
searchBar.setSearchFieldBackgroundImage(image, for: .normal)
Verwenden Sie folgende Methode:
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
Am 4. getestet. Juni. 2018
Ich habe festgestellt, dass die akzeptierte Antwort manchmal fehlerhaft ist.
So habe ich das Problem mit einer benutzerdefinierten Höhe für die searchBar gelöst: Ich habe ein Farbbild mit der gewünschten Größe festgelegt und es in textField der Suchleiste in viewDidLoad
hinzugefügt:
let image = getImageWithColor(UIColor.whiteColor(), size: CGSizeMake(600, 60))
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal)
Gefolgt mit dieser Funktion aus hier
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
var rect = CGRectMake(0, 0, size.width, size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
Sie können die Höhe des inneren Textfelds mit diesem Code ändern.
schritt 1) Legen Sie die Einschränkung fest, um Ihre UISearchBar-Höhe zu erhöhen, stellen Sie dann die Suchleiste aus und notieren Sie diesen Code im View-Controller.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[self.searchBar layoutSubviews];
float topPadding = 5.0;
for(UIView *view in self.searchBar.subviews)
{
for(UITextField *textfield in view.subviews)
{
if ([textfield isKindOfClass:[UITextField class]]) {
textfield.frame = CGRectMake(textfield.frame.Origin.x, topPadding, textfield.frame.size.width, (self.searchBar.frame.size.height - (topPadding * 2)));
}
}
}
}
wenn Sie auch etwas anderes in der Suchleiste ändern möchten, können Sie das genaue Basiselement wie UILabel, UIImage und UIView im UITextField) findenUnteransichten und kann auch Frame und Bild und andereEigenschaften ändern. Vielen Dank.
EDIT:
wie Sie in Swift gefragt haben, schreibe ich in Swift. Ich denke, du versuchst etwas falsches. Bitte versuchen Sie das.
func viewDIdLayoutSubviews()
{
super.viewDidLayoutSubviews()
self.roomInfoSearchBar.layoutSubviews()
var topPadding: Float = 5.0
for view in self.roomInfoSearchBar.subviews as [UIView]
{
for viewNew in view.subviews as [UIView]
{
if viewNew.isKindOfClass(UITextField)
{
viewNew.frame = CGRectMake(viewNew.frame.Origin.x, CGFloat(topPadding), viewNew.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2))
}
}
}
}
sie haben die 0-Index-Ansicht als erste und letzte Ansicht für die Schleife genommen. Ich denke, das ist das Problem, dass der von Ihnen übersetzte Code nicht funktioniert hat. Versuchen Sie es einmal und antworten Sie bitte.
Versuche dies:
searchBar.frame.size.height = 80
searchBar.frame.size.width = 200
Update für Swift 4.2/iOS 12.1:
let newHeight : CGFloat = 45
for subview in searchBar.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 = .roundedRect
textField.contentVerticalAlignment = .center
}
}
}