2013-02-06 21 views
7

我有一個UISearchBar,我爲其設置了UiControlStateNormal的定製UISearchBarIconClear。爲UIControlStateHighlighted定製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. 也許這只是我,但我並不認爲在解決問題時引入兩個問題是一種解決方案。 :-)

如果任何人有解決這個問題的一個更好的方法,我很樂意聽到它。

+0

感謝您的解決方案。我已經做了一些類似hacky的東西,對底層文本框和搜索欄樣式進行其他修改。這個解決方案看起來好像總體上工作得很好,但我很可能會傳遞它,因爲這對我來說不是一件重要的事情(正如你所說,通過創建2個解決問題)。也就是說,當文本字段文本根據字段中是否有任何內容改變時,可以通過隱藏/顯示按鈕來使其具有類似於常規清除按鈕的行爲。 – Dima

+0

@BenJackson:哇!在評論中感謝這個聰明的問題。理想情況下,我會說,我會發佈一個解決方案,我不會使用自己,出於同樣的原因,你會問你問的問題。這個問題的答案會完成什麼? –

2

如何使用外觀代理?

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

我剛剛遇到同樣的問題,因爲按下時清除圖標重置爲默認圖標。

這似乎是由於我試圖對普通和高亮狀態使用相同的UIImage,切換到高亮顯示狀態的不同圖像可以解決問題。

9

我有同樣的問題,並調整語句的順序解決它:

因此而不是做UIControlStateNormal第一則UIControlStateHighlighted,設置聚焦狀態第一

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

這是什麼瘋狂? –

+0

這是工作! 太棒了! 謝謝! – LLIAJLbHOu

+1

它總是奇怪的方式工作。這應該被接受爲實際的答案,而不是與子視圖混淆。正如所暗示的那樣,它可能會發生變化,而且根本不是很好......感謝這個想法。 – StuartM