13

UISearchbarのテキストフィールドをカスタマイズしようとしています。下の写真は私の半分の仕事を示しています。 強いテキスト

UISearchbarのサブクラスがあり、ViewControllerから呼び出しました。テキストフィールドからこれらの濃い灰色の線を削除しようとしています。以下は、ビューコントローラのサブビューに追加するUISearchbarの実装です。

searchbar = [[SearchBar alloc] initWithFrame:CGRectMake(35,78, 250, 17)];
searchbar.backgroundColor = [UIColor clearColor];
searchbar.layer.borderColor = [[UIColor clearColor] CGColor];
searchbar.layer.borderWidth = 0;

for(UIView *view in searchbar.subviews){
    if([view isKindOfClass:[UITextField class]]){
        UITextField *tf= (UITextField *)view;
        tf.layer.borderColor = [[UIColor clearColor] CGColor];
        tf.delegate = self;
        break;
    }
}
[self.view addSubview:searchbar];
searchbar.delegate = self;

UISearchBarサブクラス:

   - (id)initWithFrame:(CGRect)frame
  {
   self = [super initWithFrame:frame];
if (self) {
      // Initialization code
     }
     return self;
}

-(void)layoutSubviews{
     UITextField *searchField;
     [[[self subviews] objectAtIndex:0] removeFromSuperview];
     [self setTintColor:[UIColor clearColor]];
     self.clipsToBounds = YES;
     NSUInteger numViews = [self.subviews count];
     for(int i = 0; i < numViews; i++) {
        if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) { 
            searchField = [self.subviews objectAtIndex:i];
             searchField.leftViewMode = UITextFieldViewModeNever;
             searchField.backgroundColor = [UIColor clearColor];

        }


    }
    if(!(searchField == nil)) {            
        searchField.backgroundColor = [UIColor clearColor];
        searchField.textColor = [UIColor blackColor];
        searchField.frame = CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height-10);

        [searchField setBorderStyle:UITextBorderStyleRoundedRect];

    }

    [super layoutSubviews];

}

私はこのようなことを達成しようとしています:テキストフィールドには境界がないはずです。アイコンはフラット化されたUIImageViewです。

ここに画像の説明を入力してください

4

9 に答える 9

51

これは、UISearchBarサブビュー階層からテキストフィールドを取得し、必要に応じてそのプロパティを次のように設定する簡単な方法です。

  UITextField *txfSearchField = [searchbar valueForKey:@"_searchField"];
[txfSearchField setBackgroundColor:[UIColor whiteColor]];
    [txfSearchField setLeftView:UITextFieldViewModeNever];
    [txfSearchField setBorderStyle:UITextBorderStyleRoundedRect];
    txfSearchField.layer.borderWidth = 8.0f; 
    txfSearchField.layer.cornerRadius = 10.0f;
        txfSearchField.layer.borderColor = [UIColor clearColor].CGColor;
于 2012-10-19T05:39:13.933 に答える
12

文書化されていない機能を使用したくない場合、または画像を使用したくない場合は、以下を使用してください。

CGSize size = CGSizeMake(30, 30);
// create context with transparent background
UIGraphicsBeginImageContextWithOptions(size, NO, 1);

// Add a clip before drawing anything, in the shape of an rounded rect
[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,30,30)
                            cornerRadius:2.0] addClip];
[[UIColor whiteColor] setFill];

UIRectFill(CGRectMake(0, 0, size.width, size.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self.searchBar setSearchFieldBackgroundImage:image forState:UIControlStateNormal];
于 2014-03-08T06:49:08.847 に答える
12

まだ答えを探している人のために、AppleはsearchTextFieldiOS13のUISearchBarにプロパティを追加しました。これはUITextFieldから継承searchTextFieldするUISeachTextFieldです。

let searchBar = UISearchBar()
var searchField : UITextField
if #available(iOS 13.0, *) {
    searchField = searchBar.searchTextField
} else {
    searchField = //One of the other methods listed
}
于 2019-06-19T15:54:14.747 に答える
10

iOS 13.x&Swift 5.x

にアクセスするUITextFieldには、次の手順を実行しますUISearchBar

extension UISearchBar {

    /// Returns the`UITextField` that is placed inside the text field.
    var textField: UITextField {
        if #available(iOS 13, *) {
            return searchTextField
        } else {
            return self.value(forKey: "_searchField") as! UITextField
        }
    }

}
于 2019-10-30T09:06:51.893 に答える
6

IOS-5以降、外観プロキシがあります。http: //developer.apple.com/library/ios/#documentation/uikit/reference/UISearchBar_Class/Reference/Reference.htmlを参照してください(「外観のカスタマイズ」という2つのセクションがあります。 "、両方を確認してください)。

これが実際の例です。アプリ内のすべてのUISearchBarを変更します。

[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"text_box"] forState:UIControlStateNormal];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"search_icon"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
mysearchBar.tintColor = [UIColor whiteColor];
于 2013-01-16T11:02:30.497 に答える
4

実装変更に耐性があり、高性能

これを読んで、検索バーのテキストフィールドにSwiftで簡単にアクセスする方法を知りたい人には。UISearchBarを拡張して、基になる実装の変更に耐性があり、見つかった結果をキャッシュして高性能にする次のコードを使用して、 textFieldプロパティを追加できます。

import UIKit

private var foundTextFieldAssociationKey = UInt8()

extension UISearchBar {

  var textField: UITextField {
    get {
      let value = objc_getAssociatedObject(self, &foundTextFieldAssociationKey) as? UITextField

      if value == nil {
        let findInView = (UIView) -> UITextField? = { view in
          for subview in view.subviews {
            if let textField = (subview as? UITextField) ?? findInView(subview) {
              return textField
            }
          }
          return nil
        }

        guard let foundTextField = findInView(self) else {
          fatalError("UISearchBar doesn't seem to have a UITextField anywhere in the view hierarchy")
        }

        textField = foundTextField
        return foundTextField
      }

      return value!
    }
    set {
      objc_setAssociatedObject(self, &foundTextFieldAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
    }
  }

}

プロパティの名前を変更する場合は、searchFieldに変更しないでください。それはあなたの検索バーを台無しにするでしょう。

于 2015-04-01T23:52:03.573 に答える
3

iOS 13searchTextFieldでは、テキストフィールドに直接アクセスするためのプロパティがあります。

于 2019-09-27T14:40:27.580 に答える
2

iOS 10の場合、これを行う必要があることがわかりました(上から借用してすばやく適応させました)

extension UISearchBar {
    var textField: UITextField? {

    func findInView(_ view: UIView) -> UITextField? {
        for subview in view.subviews {
            print("checking \(subview)")
            if let textField = subview as? UITextField {
                return textField
            }
            else if let v = findInView(subview) {
                return v
            }
        }
        return nil
      }

      return findInView(self)
    }
 }  
于 2016-12-22T19:18:42.950 に答える
2

短くてシンプル

extension UISearchBar {
    var textField:UITextField {
        guard let txtField = self.value(forKey: "_searchField") as? UITextField else {
            assertionFailure()
            return UITextField()
        }
        return txtField
    }
}
于 2017-09-07T13:45:36.793 に答える