IOS學習 IOS8的UISearchBar對應
通常使用UISearchbar都需要去除其背景色來與自己的介面風格保持協調,但是UISearchbar的設計隨著iOS版本的升級不斷地在發生著變化,下面我們通過分析UISearchbar在各個iOS版本下的檢視層次結構來探討去除其背景色的方法。
首先使用UIView的私有方法recursiveDescription來看一下UISearchbar在iOS各個模擬器版本中的檢視層次結構。這裡使用除錯命令po [self.searchBar recursiveDescription]來檢視,結果如下:
ios5.0:
<UISearchBar: 0x76c96c0; frame = (27 1; 290 44); text = ''; autoresize = W+BM; layer = <CALayer: 0x76c9870>>
| <UISearchBarBackground: 0x76b3d40; frame = (0 0; 290 44); userInteractionEnabled = NO; layer = <CALayer: 0x76ad4a0>>
| <UISearchBarTextField: 0x76c9e40; frame = (5 6; 280 31); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x76c9fa0>>
| | <UITextFieldBorderView: 0x76e9e70; frame = (0 0; 280 31); opaque = NO; layer = <CALayer: 0x76e9f00>>
| | <UIImageView: 0x76cce70; frame = (10 8; 15 15); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x76cceb0>>
| | <UITextFieldLabel: 0x76cf630; frame = (32 7; 216 18); text = '提示語'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x76cb2c0>>
ios5.1:
<UISearchBar: 0x8378110; frame = (27 1; 290 44); text = ''; autoresize = W+BM; layer = <CALayer: 0x83782e0>>
| <UISearchBarBackground: 0x8378630; frame = (0 0; 290 44); userInteractionEnabled = NO; layer = <CALayer: 0x83786c0>>
| <UISearchBarTextField: 0x8378e50; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x8378f90>>
ios6.0:
<UISearchBar: 0xa13fc60; frame = (27 1; 290 44); text = ''; autoresize = W+BM; layer = <CALayer: 0xa13fe40>>
| <UISearchBarBackground: 0xa140380; frame = (0 0; 290 44); userInteractionEnabled = NO; layer = <CALayer: 0xa140440>>
| <UISearchBarTextField: 0xa140b90; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0xa1428b0>; layer = <CALayer: 0xa140cf0>>
ios6.1:
<UISearchBar: 0x8953b20; frame = (27 1; 290 44); text = ''; autoresize = W+BM; layer = <CALayer: 0x8953d10>>
| <UISearchBarBackground: 0x8954230; frame = (0 0; 290 44); userInteractionEnabled = NO; layer = <CALayer: 0x89542f0>>
| <UISearchBarTextField: 0x8954a30; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0x8956630>; layer = <CALayer: 0x8954b90>>
ios7.0:
<UISearchBar: 0xac923d0; frame = (27 21; 290 44); text = ''; opaque = NO; autoresize = W+BM; gestureRecognizers = <NSArray: 0xac92fe0>; layer = <CALayer: 0xac92630>>
| <UIView: 0xac92860; frame = (0 0; 290 44); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xac928c0>>
| | <UISearchBarBackground: 0xac93320; frame = (0 0; 290 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xac93440>>
| | <UISearchBarTextField: 0xac93940; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0xac953a0>; layer = <CALayer: 0xac93b20>>
| | | <_UISearchBarSearchFieldBackgroundView: 0xac98520; frame = (0 0; 0 0); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0xac985d0>>
ios7.1:
<UISearchBar: 0xa4ef3e0; frame = (27 21; 290 44); text = ''; opaque = NO; autoresize = W+BM; gestureRecognizers = <NSArray: 0xa4f0e80>; layer = <CALayer: 0xa4ef6d0>>
| <UIView: 0xa4f06f0; frame = (0 0; 290 44); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xa4f0750>>
| | <UISearchBarBackground: 0xa4f11b0; frame = (0 0; 290 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa4f1300>>
| | <UISearchBarTextField: 0xa4f1870; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0xa4f1a80>>
| | | <_UISearchBarSearchFieldBackgroundView: 0xa4f4880; frame = (0 0; 0 0); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0xa4f49e0>>
ios8.0beta:
<UISearchBar: 0x1405e140; frame = (27 21; 290 44); text = ''; opaque = NO; autoresize = W+BM; gestureRecognizers = <NSArray: 0x1405a650>; layer = <CALayer: 0x1405e3f0>>
| <UIView: 0x14059ec0; frame = (0 0; 290 44); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x14059f30>>
| | <UISearchBarBackground: 0x1405a9d0; frame = (0 0; 290 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1405ab20>>
| | <UISearchBarTextField: 0x1405b0b0; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x1405b2d0>>
| | | <_UISearchBarSearchFieldBackgroundView: 0x140609b0; frame = (0 0; 0 0); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x14060b10>>
從以上可以看出,在iOS7.0之前,UISearchbar檢視裡直接包含UISearchBarBackground和UISearchBarTextField兩個檢視,在iOS7.0及之後,UISearchbar檢視裡包含的是一個UIView檢視,UIView檢視裡才是UISearchBarBackground和UISearchBarTextField兩個檢視。經多次試驗,發現去除UISearchbar檢視裡的UISearchBarBackground後UISearchbar的背景就透明瞭,程式碼如下:
for (UIView *view in self.searchBar.subviews) {
// for before iOS7.0
if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[view removeFromSuperview];
break;
}
// for later iOS7.0(include)
if ([view isKindOfClass:NSClassFromString(@"UIView")] && view.subviews.count > 0) {
[[view.subviews objectAtIndex:0] removeFromSuperview];
break;
}
}
以上程式碼在iOS5/6/7/8.0beta下測試均有效,希望對需要使用UISearchBar的人有幫助。
--------------------------------------
以上是轉載內容,下面寫個自己的實現方案:
在xib中可以設定的backgroundImage是載入到UISearchBarBackground層上的image,在ios7.0以及之後的系統上只要設定一個透明的圖片,就可以在不刪除UISearchBarBackground的情況下達到透過UISearchBarBackground的目的。設定UISearchBar的BackgroundColor即可。
ios7.0之前的版本可以通過設定UISearchBar的tintcolor實現設定顏色。
備註:UISearchBarTextField的frame只是textfield那麼大小
相關文章
- iOS swift UISearchBar拿到textfield控制元件iOSSwiftUI控制元件
- ios8系統定位問題iOS
- iOS8 Framework使用載入xib及圖片iOSFramework
- UISearchBar預設高度UI
- iOS8 自定義UITabBar (使用popToViewController導致的UITabBarButton重疊的問題)iOSUItabBarViewController
- iOS SDWebImage 學習iOSWeb
- Contrastive Learning 對比學習 | RL 學 representation 時的對比學習AST
- iOS-Blocks學習iOSBloC
- 【Numpy應用】--對於圖片處理的機器學習庫的應用機器學習
- iOS KVO學習記錄iOS
- iOS KVC學習記錄iOS
- iOS 學習使用 Swift CodableiOSSwift
- iOS Block學習筆記iOSBloC筆記
- UIBarButtonItem 在 iOS 11 上的改變及應對方案UIiOS
- 如何巧妙應對iOS鍵盤難題?iOS
- 應對快速變化的Android開發環境:高效學習策略Android開發環境
- Linux| |對於UDP的學習LinuxUDP
- 對深度學習的認識深度學習
- iOS學習筆記18 CoreData你懂的iOS筆記
- iOS入門學習計劃iOS
- iOS 多執行緒-學習iOS執行緒
- iOS學習筆記02 UIScrollViewiOS筆記UIView
- ios 深淺拷貝學習iOS
- iOS開發學習路線iOS
- 物理學習方法對學習的限制,procrastination, experience to Medel or converselyAST
- 碎片化學習Java(十四)--Java switch判斷月份對應的季節Java
- 我對組隊學習的看法
- iOS Tangram(VirtualView)動態元件的學習與使用iOSView元件
- Cordova學習--iOS自定義外掛iOS
- 學習的學習之七—如何應用元知識
- iOS初級開發學習筆記:APP生命週期的學習總結iOS筆記APP
- 鴻蒙 Android iOS 應用開發對比02鴻蒙AndroidiOS
- 對於學習的一些思考
- 與MSSQL對比學習MYSQL的心得MySql
- ios零基礎學習 準備什麼,如何去學習iOS
- [譯] iOS 11:機器學習人人有份iOS機器學習
- iOS學習筆記43 Swift(三)類iOS筆記Swift
- iOS學習筆記05 觸控事件iOS筆記事件
- iOS學習筆記39 ReactiveCocoa入門iOS筆記React