iOSのUIsearchBar検索ボックスコンポーネントの基本使用ガイド

5703 ワード

UIsearchBarもiOS開発の一般的なコントロールの一つで、中の属性barStyle、text、placeholderなどをクリックしてみましょう.しかし、これらの属性は明らかに私たちの開発ニーズを満たすには不足しています.たとえばplaceholderの色を変更したり、UIsearchBarの上のUItextfieldの背景色を変更したり、UItextfieldの上の写真を変更したりします.
上記のニーズを実現するためには、UIsearchBarのサブクラスをLSSearchBarと書くとよいでしょう.
LSSearchBar.h以下:
 
  
#import

@interface LSSearchBar : UISearchBar

@end


LSSearchBar.mは以下の通りである.
 
  
#import "LSSearchBar.h"

@implementation LSSearchBar

- (void)layoutSubviews {

    [super layoutSubviews];

    // self.subviews searchField
    UITextField *searchField;
    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,

    if (searchField ==  nil) {
        NSArray *arraySub = [self subviews];
        UIView *viewSelf = [arraySub objectAtIndex:0];
        NSArray *arrayView = [viewSelf subviews];
        for(int i = 0; i < arrayView.count; i++) {
            if([[arrayView objectAtIndex:i] isKindOfClass:[UITextField class]]) {
                searchField = [arrayView objectAtIndex:i];
            }
        }
    }


    if(!(searchField == nil)) {
        //
        searchField.textColor = [UIColor whiteColor];

        //
        [searchField setBackground: [UIImage imageNamed:@"searchbar"] ];
        [searchField setBorderStyle:UITextBorderStyleNone];

        // placeholder
        [searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

        // searchField
        UIImage *image = [UIImage imageNamed:@"search"];
        UIImageView *iView = [[UIImageView alloc] initWithImage:image];
        iView.frame = CGRectMake(0, 0, 15, 15);
        searchField.leftView = iView;
    }

}

@end


UIsearchBarの背景色を変更するISearchBarは2つのsubViewからなり、1つはUIsearchBarBackGroupで、もう1つはUItextFieldです.IBにバックグラウンドを直接操作しない属性を指定します.UISearchBarBackGroundを直接削除する方法
 
  
seachBar=[[UISearchBar alloc] init]; 
seachBar.backgroundColor=[UIColor clearColor]; 
for (UIView *subview in seachBar.subviews){   
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")])  {   
        [subview removeFromSuperview];   
    break; 
    }  
}

UIsearchBar文字の色が1.iOSの7アクセステキストフィールドでは、より多くのことを水平に再確認する必要があります.コードを変更するには
 
  
for (UIView *subView in self.searchBar.subviews)
{
 for (UIView *secondLevelSubview in subView.subviews){
  if ([secondLevelSubview isKindOfClass:[UITextField class]])
  {
   UITextField *searchBarTextField = (UITextField *)secondLevelSubview;
   //set font color here
   searchBarTextField.textColor = [UIColor blackColor];
   break;
  }
 }
}

または設定可能なtintcolorはsearch barでキーに適用されます.tintColorを使用してシェーディングの前景にbartintColorを使用してシェーディングするバーの背景を使用します.iOSシステムV 7において.0,のUIViewのサブクラス派生ベースクラス挙動tintColor.見てtintColorはUIViewのレベルのアップルのファイルのために
2.文字の色を設定することで
 
  
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor blueColor]];

3.これは本当ですが、UIAppearanceプロトコルは「公開API」です.これは本当ではありません.UITextFieldのサポートです.見てごらんh文字列「UI_APPEARANCE_SELECTOR」を検索すると、この文字列のインスタンスが表示されます.もしあなたが見たらNetでは、UIAppearance APIが正式にサポートしている属性が少なくありません.これは周知のように、UITExtFieldはサポートされていないUIAPIなので、サンディップでの答えコードは常に実行可能ではなく、実際には最善の方法ではありません.これは投稿のリンクです.正しい方法は、サブビュー(または、サブビューが主にIOS 7のサブビューに使用される)と手動設定です.そうでないと、信頼できない結果になります.ただし、カテゴリのUIsearchBarを作成し、setTextColor:(*のUIcolor)の例を追加することができます.
 
  
- (void)setTextColor:(UIColor*)color
{
 for (UIView *v in self.subviews)
 {
  if([Environment isVersion7OrHigher]) //checks UIDevice#systemVersion   
  {
   for(id subview in v.subviews)
   {
    if ([subview isKindOfClass:[UITextField class]])
    {
     ((UITextField *)subview).textColor = color;
    }
   }
  }
  else
  {
   if ([v isKindOfClass:[UITextField class]])
   {
    ((UITextField *)v).textColor = color;
   }
  }
 }
}

UIsearchBarの背景図をカスタマイズ
 
  
- (void)layoutSubviews {
    UITextField *searchField;
    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];
        }
    }
    if(!(searchField == nil)) {
        searchField.textColor = [UIColor whiteColor];
        [searchField.leftView setHidden:YES];
        [searchField setBackground: [UIImage imageNamed:@"SearchBarBackground.png"] ];
        [searchField setBorderStyle:UITextBorderStyleNone];
    }
     
    [super layoutSubviews];
}