2013-02-06 15 views
7

私はUiControlStateNormalのカスタムUISearchBarIconClearを設定したUISearchBarを持っています。UICearchStylHighlightedのUISearchBarIconClearをカスタマイズしても動作しません。

[mySearchBar setImage:myImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal]; 

この部分は、それが必要として動作しますが、クリアボタンをタップしたときに、残念ながら、それは私が設定した画像から、元のデフォルトのグレーのいずれかに変更します。

私はUIControlStateHighlightedのイメージを設定しようとしましたが、明らかに動作しません。

documentationは実際に

有効な状態がUIControlStateNormalとUIControlStateDisabledです述べています。

ハイライトされた状態に設定できない場合、デフォルトの状態のカスタムボタンを設定するポイントは何ですか?何か不足していますか?どのような考えや回避策、ありがとう!

+0

最初の強調表示された状態のために画像を設定します完璧に動作します...強調表示された状態でさえ... – jimpic

答えて

0

今日は同じ問題を少し前にしていますが、ここでは私が本当に醜い回避策を講じています。

for(UIView *subView in searchBar.subviews) { 
    if([subView isKindOfClass: [UITextField class]]){ 
     UITextField *searchField = (UITextField *)subView; 
     CGFloat myWidth = 26.0f; 
     CGFloat myHeight = 30.0f; 
     UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, myWidth, myHeight)]; 
     [myButton setImage:[UIImage imageNamed:@"searchbariconclear"] forState:UIControlStateNormal]; 
     [myButton setImage:[UIImage imageNamed:@"searchbariconclear"] forState:UIControlStateHighlighted]; 

     [myButton addTarget:self action:@selector(clearsearchbar) forControlEvents:UIControlEventTouchUpInside]; 

     searchField.rightView = myButton; 
     searchField.rightViewMode = UITextFieldViewModeAlways; 
     searchField.clearButtonMode = UITextFieldViewModeNever; 
    } 
} 

そして...このアプローチの

- (void)clearsearchbar { 
    for(UIView *subView in searchBar.subviews) { 
     if([subView isKindOfClass: [UITextField class]]){ 
      UITextField *searchField = (UITextField *)subView; 
      searchField.text = nil; 
     } 
    } 
} 

三つの問題..

  1. 我々は検索バーのサブビューの内側の周りに掘っているので、それが持ついくつかの日を破ることができOSアップデート。

  2. これは、クリアアイコンが常に表示されるという点で、UISearchBarIconClearとまったく同じように動作しません。このアプローチを使用して、他のUITextFieldViewModesでテストを試みる可能性があります。何らかの理由で他のものがここで理想的かもしれません。

  3. たぶんそれは私ですが、それを解決しようとすると2つの問題を引き起こすものが解決策であるとは本当に思いません。 :-)

誰かがこの問題に取り組むより良い方法を持っているなら、私もそれを聞いてみたいです。

+0

解決に感謝します。私は、基本的なテキストフィールドと検索バーのスタイリングに他の修正を加えるために、同様のハックなものをいくつかやってきました。この解決法は一般的にうまくいくようですが、これは私にとっては重要なことではありません(あなたが言ったように、2つ以上を作成して問題を解決する)ので、私はそれを渡す可能性が最も高いでしょう。つまり、フィールドに何かがあるかどうかに基づいてテキストフィールドのテキストが変更されたときに、ボタンを非表示にすることで、通常のクリアボタンのように動作させることができます。 – Dima

+0

@BenJackson:うわー!コメントの賢明な質問のおかげで。理想的には、同じ理由で私が自分で使っていない解決策を投稿すると、質問した質問をするでしょう。その質問に対する答えは何を達成するでしょうか? –

2

外観プロキシの使用はどうですか?

[[UIButton appearanceWhenContainedIn:[UITextField class], [UISearchBar class], nil] setImage:myImage forState:UIControlStateHighlighted]; 
2

私はちょうど押されたときにデフォルトアイコンにクリアされたクリアアイコンで説明したのと同じ問題がありました。

これは、通常と強調表示された状態の両方に同じUIImageを使用しようとしているためです。強調表示された状態の別のイメージに切り替えて問題を解決しました。

9

私は同じ問題を抱えていた、と文の順序を調整することは、それを解決:、

ので、代わりのUIControlStateHighlighted最初UIControlStateNormalをやって、この、私のために

[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted]; 
[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal]; 
+1

この狂気は何ですか? –

+0

それは仕事です! 素晴らしい! ありがとう! – LLIAJLbHOu

+1

それは常に奇妙な方法です。これは、サブビューを乱すのではなく、実際の答えとして受け入れられるべきです。提案されているように、変化する可能性があり、大きくはない...この考えに感謝します。 – StuartM

関連する問題