UISearchBar詳解

今天公司的項目測試的差不多了,基本可以上架了物延,又有時間來分享一下最近遇到的一些問題了宣旱,公司的項目進(jìn)行了大改版(應(yīng)該是全改了,基本是一個新的項目了)叛薯,老大決定用swift重寫浑吟。之前一直在自學(xué)swift,終于這一次可以實戰(zhàn)了耗溜。項目中搜索用的比較多组力,但是搜索框的樣式與默認(rèn)的差別太大了,所以只能自定義了抖拴。

<p>The UISearchBar class implements a text field control for text-based searches. The control provides a text field for entering text, a search button, a bookmark button, and a cancel button. The UISearchBar object does not actually perform any searches. You use a delegate, an object conforming to the UISearchBarDelegate protocol, to implement the actions when text is entered and buttons are clicked.<p>

以上是蘋果對UISearchBar的解釋燎字,可以看見UISearchBar提供了類似UITextField的輸入(其實它的組成中就有UITextField腥椒,下面會講到),右邊有搜索按鈕候衍、標(biāo)簽按鈕笼蛛、關(guān)閉按鈕可供選擇,搜索都是在協(xié)議UISearchBarDelegate中進(jìn)行蛉鹿。

1.自定義外觀


默認(rèn)搜索外觀
項目搜索外觀

UISearchBar的層級很是復(fù)雜主要由UISearchBarBackgroud滨砍、UISearchBarTextField、UINavigationButton組成妖异,其中UISearchBarTextField就是輸入框惋戏,主要是由——UISearchBarSearchFieldBackgroundView、UIButton(?)随闺、UIImageView(??)等組成日川,獲取TextField方法:

let searchFiled:UITextField = self.searchBar.value(forKey: "_searchField") as! UITextField

這樣就可以通過修改 searchFiled來修改輸入樣式(圓角蔓腐、字體等)矩乐。

UISearchBar的直接子控件是UIVIew,其上的子控件UISearchBarBackgroud的frame與UISearchBar的bounds相等回论,UISearchBarTextField的高度默認(rèn)為28與UISearchBar左右有8像素的固定間距散罕,上下間距為直接子控件UIView的高度 - UISearchBarTextField的默認(rèn)高度28 再除以2。因此UISearchBar的輸入框始終與設(shè)置的frame不一樣傀蓉,不便于布局欧漱,我們可以添加一個子類繼承UISearchBar,可以更改其內(nèi)邊距葬燎。

class MySearchBar: UISearchBar {
    
    // 監(jiān)聽是否添加了該屬性
    var contentInset: UIEdgeInsets? {
        didSet {
            self.layoutSubviews()
        }
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        // 便利尋找
        for view in self.subviews {
            for subview in view.subviews {
                // 判定是否是UISearchBarTextField
                if subview.isKind(of: UITextField.classForCoder()) {
                    if let textFieldContentInset = contentInset {
                        // 修改UISearchBarTextField的布局
                        subview.frame = CGRect(x: textFieldContentInset.left, y: textFieldContentInset.top, width: self.bounds.width - textFieldContentInset.left - textFieldContentInset.right, height: self.bounds.height - textFieldContentInset.top - textFieldContentInset.bottom)
                    } else {
                        // 設(shè)置UISearchBar中UISearchBarTextField的默認(rèn)邊距
                        let top: CGFloat = (self.bounds.height - 28.0) / 2.0
                        let bottom: CGFloat = top
                        let left: CGFloat = 8.0
                        let right: CGFloat = left
                        contentInset = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
                    }
                }
            }
        }
    }

}

讓實例化的UISearchBar繼承MySearchBar误甚,然后就可以很方便的直接控制內(nèi)邊距了

self.searchBar.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

接下來就是處理placeholder靠左,這個就比較麻煩了谱净,查詢了一大堆辦法都挺麻煩的窑邦,最后找到了一個很投機(jī)的辦法:先判定手機(jī)寬度,然后在placeholder右邊加上空格做成靠左的假象壕探。

 if SCREEN.WIDTH == 320 {
            self.searchBar.placeholder = "搜索位置       "
        }else if SCREEN.WIDTH == 373\5 {
            self.searchBar.placeholder = "搜索位置                  "
        }else if SCREEN.WIDTH == 414 {
            self.searchBar.placeholder = "搜索位置                                 "
        }

然后在storyboard中設(shè)置searchBar的BarStyle為Minimal就可以很方便的控制UISearchBar的外觀了冈钦。
到這里就剩一個問題了:UISearchBar上下的兩根黑線了,去除方法:

self.searchBar.setBackgroundImage(UIImage.init(), for: .any, barMetrics: .default)

2.搜索的使用
如蘋果官方文檔所說李请,與搜索相關(guān)的都是在其代理方法中完成瞧筛。UISearchBar有很多的代理方法,感興趣的可以點(diǎn)擊進(jìn)入查看UISearchBarDelegate我就介紹幾個常用的:

當(dāng)搜索內(nèi)容變化時导盅,執(zhí)行該方法,可以實時監(jiān)聽輸入框的變化,可以實現(xiàn)時實搜索较幌。

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)textNS_AVAILABLE_IOS(3_0);                 // called before text changes

也行你想把搜索事件放在點(diǎn)擊搜索以后再觸發(fā),那就選用這個方法白翻,它就是點(diǎn)擊搜索后的代理方法

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar;

3.結(jié)束

當(dāng)然如果你覺得這樣太麻煩了乍炉,你還可以選擇用UITextField來實現(xiàn)UISearchBar的功能,但是最終哪一個更加的麻煩還需要試一試才知道。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恩急,一起剝皮案震驚了整個濱河市杉畜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衷恭,老刑警劉巖此叠,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異随珠,居然都是意外死亡灭袁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門窗看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸歧,“玉大人,你說我怎么就攤上這事显沈∪硐梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵拉讯,是天一觀的道長涤浇。 經(jīng)常有香客問我,道長魔慷,這世上最難降的妖魔是什么只锭? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮院尔,結(jié)果婚禮上蜻展,老公的妹妹穿的比我還像新娘。我一直安慰自己邀摆,他們只是感情好纵顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隧熙,像睡著了一般片挂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞盯,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天音念,我揣著相機(jī)與錄音,去河邊找鬼躏敢。 笑死闷愤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的件余。 我是一名探鬼主播讥脐,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遭居,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旬渠?” 一聲冷哼從身側(cè)響起俱萍,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎告丢,沒想到半個月后枪蘑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岖免,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年岳颇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅湘。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡话侧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闯参,到底是詐尸還是另有隱情瞻鹏,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布赢赊,位于F島的核電站乙漓,受9級特大地震影響级历,放射性物質(zhì)發(fā)生泄漏释移。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一寥殖、第九天 我趴在偏房一處隱蔽的房頂上張望玩讳。 院中可真熱鬧,春花似錦嚼贡、人聲如沸熏纯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樟澜。三九已至,卻和暖如春叮盘,著一層夾襖步出監(jiān)牢的瞬間秩贰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工柔吼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毒费,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓愈魏,卻偏偏與公主長得像觅玻,于是被迫代替她去往敵國和親想际。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容