2015-06-16 6 views
23

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.

  1. Zugang der UITextField innerhalb UISearchbar und seine Höhe ändern - Ergebnisse: Die Konsolenausgabe zeigt, dass die Parameter geändert, aber auf dem Bildschirm bleibt die UITextField 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.

+0

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

+0

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

Antwort

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

    } 

Dies könnte helfen Ihnen :)

+1

Ja, Ihr Code ändert die Größe des Textfelds selbst, was für mich ein großer Fortschritt ist! = D. Ich nehme an, dass Auto-Layout seine Sache nach "viewDidLoad" aber vor "viewDidAppear" macht. Das einzige Problem bei dieser Methode besteht darin, dass die Größenänderung auftritt - d. H. Die Ansicht wird mit der intrinsischen Größe von Autlayout geladen und ändert sich dann plötzlich zu der in "frame.size.height" angegebenen Größe. Ich habe versucht, es in 'viewWillAppear' zu setzen, nur um zu sehen, aber dann hat das Feld eine intrinsische Größe. Ein weiteres kleines Problem, das behoben werden könnte, ist, dass das Feld nicht in der Suchleiste zentriert ist. – janson

+0

hey, Ändere 'textfield.bounds' anstelle von' frame'. Ich aktualisiere die Antwort. lassen Sie mich wissen, dass es für mich gut funktioniert – Yuyutsu

+0

Das Ändern in Grenzen hilft, indem Sie die Notwendigkeit für den Zentrierungscode entfernen. Einziges Problem ist, dass die Größenänderung für den Benutzer sichtbar ist. Leider ist viewDidAppear im Screen Draw Prozess zu spät. Auch in 'willLayoutSubviews' ist das Redraw immer noch sichtbar. – janson

2

Sie können die Höhe des inneren Textfelds ändern, indem Sie diesen Code eingeben.

Schritt 1) ​​Setzen Sie die Einschränkung, um Ihre UISearchBar-Höhe zu erhöhen, machen Sie dann den Ausgang der Suchleiste 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))); 
      } 
     } 
    } 
} 

auch, wenn Sie etwas anderes wollen in der Suchleiste ändern, dann können Sie die genaue Basiselement wie UILabel finden, UIImage und UIView innerhalb des UITextFieldSubviews und kann sich ändern die Rahmen und Bild und andereEigenschaften auch. Vielen Dank.

EDIT:

, wie Sie in swift fragte sie in schnellen schreibe. Ich denke du versuchst etwas falsch. Bitte versuchen Sie es.

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-Indexansicht als erste und letzte zu schleifende Ansicht genommen. Ich denke, das ist das Problem, der Code, den Sie übersetzt haben, hat nicht funktioniert. Versuchen Sie es einmal und bitte antworten Sie.

+0

Ich habe versucht, Ihren Vorschlag schnell zu übersetzen. Ich denke, ich habe es richtig übersetzt, aber das Textfeld im Inneren ist immer noch die ursprüngliche Höhe. – janson

+0

sehe meine bearbeitete Antwort und bitte benutze den genauen Code von mir, den ich bearbeitet habe. –

+0

Sie hatten self.roomInfoSearchBar_views [0], was falsch ist. Das Textfeld kann in einer beliebigen Ansicht sein, die sich in jeder Unteransicht von UISearchBar befindet. Sie können nicht davon ausgehen, dass es in der Ansicht bei Index 0 kommt. –

4

Ich habe die akzeptierte Antwort gefunden Buggy manchmal zu sein.
Dies ist, wie ich das Problem gelöst habe für die SearchBar eine benutzerdefinierte Höhe aufweist: I ein Farbbild mit der Größe eingestellt habe ich will, und fügte es das Textfeld des SearchBar in viewDidLoad: mit

let image = getImageWithColor(UIColor.whiteColor(), size: CGSizeMake(600, 60)) 
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal) 

Gefolgt

func setSearchFieldBackgroundImage(backgroundImage: UIImage?, forState state: UIControlState) 

Die Höhe des U: diese Func von here

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

Wenn Sie genommen ISearchBars UITextfield würde der Höhe des Bildes entsprechen.

Sie können ein Bild einfügen, um UISextBars UITextfield-Höhe und backgroundImage anzupassen.

Oder können Sie die Funktion unten verwenden, um eine runde Ecke UIImage 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 ist ignored.But einen Eckenradius haben, ist es besser, größer als 10.0.

Der Code würde wie folgt sein aussehen:

let image = self.getImageWithColor(UIColor.lightGrayColor(), size: CGSizeMake(20, 20)) 
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal) 
+0

Funktioniert als ein Charme. Die Höhe der Suchleiste "flippt" beim Bearbeiten von Text auf früheren Lösungen. – djserva

+0

Dies ist wirklich der sauberste und beste Weg aller Antworten, die ich im Internet gefunden habe. – zero3nna

0

Höhe Beschränkung auf Ihre Suchleiste im Storyboard-Ansicht hinzufügen.

Dieser Schnappschuss macht es einfach zu verstehen.

enter image description here

Verwandte Themen