web-dev-qa-db-ja.com

UISearchbar TextFieldの高さを変更できますか?

私は自分のUIをテストしていますが、検索バーは自分の好みには少し狭すぎます。また、視力の低い人や手先の器用さが乏しい人が、必要なインターフェイスを表示するのに問題がないことを確認したいと思います。

したがって、私がやりたいのは、UITextfield内のUISearchbarの高さを調整することです。

試したこと:1. Storyboardで、UISearchbar Height制約を追加します-結果:検索バーのサイズは大きくなりますが、UITextFieldの内部は同じままです。

  1. UITextField内のUISearchbarにアクセスし、その高さを変更します-結果:コンソール出力はパラメーターが変更されたことを示しますが、画面上ではUITextFieldの高さは変わりません。

注-方法2を使用してUITextFieldの他のパラメーターを変更できます。変更は画面に反映されるため、UITextFieldに到達していることがわかります

メソッド2のコードは、UISearchbarが配置されているViewControllerのviewDidLoad()に配置します:

_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でのように動作することを望みますフィードバックなしで設定を単に無視するのとは対照的に。

編集:

マヘシュに応えて。 Objective C++についてはあまり知りませんが、あなたが書いたものをSwiftに変換するために最善を尽くしました。これは私が持っているものです:

(私の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))
    }
  }
}
_

コードをSwiftに変換する際に問題が発生したため、テキストフィールドにアクセスするためのコードを保持しました。 CGRectMake-Swift topPaddingはCGFloatではないことや、最後の変数(Yサイズ)を含むさまざまなタイプについて不平を言いました。再びCGFloatとFloatを混ぜるのは好きではありませんでした。それも。

残念ながら、機能していないようです。ストーリーボードでUISearchbarの高さを80に変更し、全高の約1/3をカバーするテキストフィールドを持つ非常に高い検索バーを取得しました。

#2を編集:Yuyutsuの組み込みとMaheshコードの修正バージョン。まだ完璧ではないが、より近い。 Yuyutsuのコードは機能しますが、私のコメントで述べたように、フィールドが中央に配置されず、ビューが最初に読み込まれるときにサイズ変更も表示されます(高さAから高さBへのジャンプ)。もう1つの欠点は、方向が変更されるとviewDidAppearでサイズ変更が行われるため、フィールドが固有のサイズに戻ることです。

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

Yuyutsuのコードを見て、他にこの調整を配置できる場所を知りたかったのですが、別のstackoverflowの投稿で link に出会いました。私が読んだものに基づいて、マヘシュの答えがうまくいくはずだとわかりました。ここで、なぜ機能しないのかがわかりました-オーバーライド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)
        }
      }
    }
  }
_

ですから、今残っているのは、ビューが表示される前にテキストフィールドが設定されたサイズになるようにして、ユーザーに表示されるサイズのシフトがないようにすることです。

最終編集:完全に機能するコード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
        }
      }
    }
  }
_

有津ありがとうございます。 Maheshは、最初から最終的な解決策を考え出してくれてありがとう、重要な部分をいくつか欠いています。

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

    }

これはあなたを助けるかもしれません:)

13
Yuyutsu

あなたが使用する場合:

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

UISearchBarのUITextfieldの高さは、Imageの高さと同じです。

画像をドロップして、UISearchBarのUITextfieldの高さとbackgroundImageをカスタマイズするために使用できます。

または、以下の関数を使用して丸い角のUIImageを作成できます。

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
}

UIImageの幅は無視されます。しかし、角の半径を持つためには、10.0

コードは次のようになります。

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

これは正しいですSwift 4. UISearchBarの高さを変更する方法についての答え:

  let image = getImageWithColor(color: UIColor.clear, size: CGSize(width: 1, height: 40))
  searchBar.setSearchFieldBackgroundImage(image, for: .normal)

次の方法を使用します。

  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
    }

4日にテスト済み。六月。 2018年

6
dfi

私は、受け入れられた答えが時々バグがあることを発見しました。
これは、searchBarのカスタムの高さの問題を解決する方法です。必要なサイズのカラー画像を設定し、viewDidLoadのsearchBarのtextFieldに追加しました。

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

here から取得したこのfuncが続きます

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

このコードを試して、内側のテキストフィールドの高さを変更できます。

ステップ1)UISearchBarの高さを増やすように制約を設定してから、検索バーのアウトレットを作成し、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)));
            }
        }
    }
}

また、検索バーで他の何かを変更する場合は、ILabelIImage、およびIViewのような正確なベース要素を見つけることができますITextFieldsubviewsおよびframeおよびimageおよびotherpropertiesも。ありがとう。

編集:

Swiftでそれを書いています。Swiftで書いています。何かおかしいと思っています。これを試してください。

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

ループする最初と最後のビューとして0インデックスビューを使用しました。翻訳したコードが機能しなかった問題だと思います。一度試してから返信してください。

3
Mahesh Agrawal

これを試して:

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

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