webentwicklung-frage-antwort-db.com.de

Kann die Höhe des UISearchbar TextFields geändert werden?

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.

  1. Greifen Sie auf 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.

31
janson
    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 :)

12
Yuyutsu

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)
8
wj2061

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

5
dfi

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
}
5
rcat24

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.

3
Mahesh Agrawal

Versuche dies:

searchBar.frame.size.height = 80
searchBar.frame.size.width = 200
0
HSAM

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
        }
    }
}
0
WR-BikAir