流式按鈕布局-熱門搜索-歷史搜索

App搜索頁面經(jīng)常用到關(guān)鍵詞提示,例如手機淘寶的【歷史搜索】,網(wǎng)易云音樂的【熱門搜索】。為了方便使用,筆者寫了一個可以流式布局按鈕的view并封裝。

【文末附運行效果及demo】

思考

需要哪些樣式?

  • 按鈕帶圓角,有邊框;
  • 按鈕寬度根據(jù)標題長度自適應(yīng);
  • 按鈕之間可以調(diào)整間距。

流式布局的核心是什么?

  • 核心邏輯:當 當前按鈕寬度在視圖水平方向放得下時就把按鈕添加在當前水平方向,當 當前按鈕寬度在視圖水平方向放不下時就換一行添加。

實現(xiàn)

  1. 自定義一個view,view上的按鈕根據(jù)傳進來的關(guān)鍵詞數(shù)組循環(huán)創(chuàng)建。
  2. 將上一個按鈕做標記,創(chuàng)建當前按鈕時根據(jù)上一個按鈕的位置設(shè)置當前按鈕位置。
if (i == 0) {

    btn.frame = CGRectMake(self.padding, self.padding, rect.size.width + 15, rect.size.height + 15);
}else {

    CGFloat leftWidth = CGRectGetWidth(self.frame) - btnPrev.frame.origin.x - btnPrev.frame.size.width - self.padding * 2;
    if (leftWidth > rect.size.width) {

        btn.frame = CGRectMake(CGRectGetMaxX(btnPrev.frame) + self.padding, btnPrev.frame.origin.y, rect.size.width + 15, rect.size.height + 15);
    }else {

        btn.frame = CGRectMake(self.padding, CGRectGetMaxY(btnPrev.frame) + self.padding, rect.size.width + 15, rect.size.height + 15);
    }
}
  1. 利用layer設(shè)置按鈕圓角、邊框等樣式。
btn.layer.cornerRadius = 12;
btn.layer.masksToBounds = YES;
btn.layer.borderWidth = 1;
btn.layer.borderColor = self.borderColor.CGColor;
  1. 標記按鈕,利用 block(也可以選擇代理)將按鈕作為參數(shù)傳出,進行點擊事件操作。
- (void)onBtnClick:(UIButton *)btn {

    if (self.clickBlock) {

        self.clickBlock(btn);
    }
}

注意

  1. view的高度在創(chuàng)建完最后一個按鈕后才能確定,所以在for循環(huán)中別忘了最后設(shè)置一下view的高度。
//最后一個按鈕時設(shè)置視圖高度
if (i == self.words.count - 1) {

    CGRect aRect = self.frame;
    aRect.size.height = CGRectGetMaxY(btn.frame) + 10;
    self.frame = aRect;
}
  1. 為了更方面使用,封裝view時可以留出屬性接口方便對其設(shè)置。
/* 可單獨設(shè)置樣式,不設(shè)置則為默認樣式
* words 詞匯數(shù)組
* btnColor 按鈕背景色
* titleColor 文字顏色
* borderColor 按鈕邊框顏色
* padding 按鈕間隔
* wordHeight 詞匯高度
* fontSize 字體大小
*/
@property (nonatomic, strong) NSArray *words;
@property (nonatomic, strong) UIColor *btnColor;
@property (nonatomic, strong) UIColor *titleColor;
@property (nonatomic, strong) UIColor *borderColor;
@property (nonatomic, assign) CGFloat padding;
@property (nonatomic, assign) CGFloat wordHeight;
@property (nonatomic, assign) CGFloat fontSize;
  1. 你也可以在自定義view時的初始化方法中添加好默認設(shè)置,如果使用時不想過多設(shè)置,可以使用默認效果。
//初始化:默認設(shè)置
- (instancetype)init {
    if (self = [super init]) {

        self.btnColor = [UIColor whiteColor];
        self.titleColor = [UIColor blackColor];
        self.borderColor = [UIColor lightGrayColor];
        self.padding = 10;
        self.wordHeight = 25;
        self.fontSize = 15;
    }
    return self;
}
  1. block 中將 button 作為唯一參數(shù)即可,標題可以通過 button.currentTitle 獲取,拿到 button 可以做的事情更多,例如改變選中按鈕的顏色等等。
- (void)onBtnClick:(UIButton *)btn {

    if (self.clickBlock) {

        self.clickBlock(btn);
    }
}
效果

完整demo

總結(jié)

這個效果只要理解了流式布局的核心邏輯,處理起來就很簡單了。最后為了方便使用,封裝時注意一些細節(jié)即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 14,150評論 1 92
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,036評論 25 709
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,330評論 0 17
  • “今天去醫(yī)院補心了,醫(yī)生看了一下說,傷的太厲害了,沒法補了,還是把它取了吧!我說行吧。 后面醫(yī)生又來一句,說:把肺...
    漫漫無憂閱讀 309評論 8 9
  • 如果沒記錯的的話認識錢超超,應(yīng)該是在16年的4月份在健身房。那天我還記得特別清楚,我們兩都在跑步機上跑步,與我而言...
    錢瑾cassiel閱讀 486評論 1 2

友情鏈接更多精彩內(nèi)容