ios 如何做仿美團(tuán)的選擇地址界面

界面效果:

因?yàn)楸救瞬](méi)有分離這個(gè)界面,所以暫時(shí)沒(méi)辦法將demo公布出來(lái),只能將將重點(diǎn)的代碼貼出來(lái)

    1. 首先是自定義熱門城市這種樣式的Cell紧阔,因?yàn)槲矣玫氖莔odel,所以請(qǐng)大家看到明白
-(void)setLocationFirstViewCellWithModel:(NSArray<LocationModel *> *)modeles {
    self.backgroundColor = COLOR(240, 240, 240, 1);
    self.contentView.backgroundColor = [UIColor clearColor];
    self.dataSource = [NSMutableArray arrayWithArray:modeles];

    CGFloat screenWigth = [UIScreen mainScreen].bounds.size.width;
    //首先,每一行要有3個(gè)Button,最左邊和最右邊的間隔都為15,中間的間隔為15,可以算出每個(gè)Button個(gè)寬度
    CGFloat buttonWigth = (screenWigth - (15+ 30 ) - 15*2) / 3.0;
    //臨時(shí)變量 - 確定循環(huán)次數(shù)
    NSInteger temp_i = 0;
    //臨時(shí)變量 - 確定當(dāng)前列
    NSInteger temp_k = 0;
    //臨時(shí)變量 - 確定共有多少列
    NSInteger temp_count_k = ceil([modeles count] / 3.0) - 1;
    self.contentView.userInteractionEnabled = YES;
    //根據(jù)得到的數(shù)據(jù)確定有多少個(gè)button
    for (LocationModel *model in modeles) {
        UIButton *button = [self viewWithTag:100 + temp_i];
        //創(chuàng)建button
        if (![self.contentView viewWithTag:(100 + temp_i ) ]) {
            button = [UIButton buttonWithType:UIButtonTypeSystem];
            button.layer.cornerRadius = 5;
            [button setTitleColor:COLOR(100, 100, 100, 1) forState:UIControlStateNormal];
            button.backgroundColor = [UIColor whiteColor];
            button.layer.borderColor = [COLOR(220, 220, 220, 1) CGColor];
            button.layer.borderWidth =  0.5;
            button.tag = temp_i +100;
            [button addTarget:self action:@selector(clickLocationButton:) forControlEvents:UIControlEventTouchUpInside];
            self.contentView.userInteractionEnabled = YES;
            [self addSubview:button];
            
            //button到父視圖Left的距離
            CGFloat buttonToViewLeft = 15 + temp_i%3 *(buttonWigth + 15);
            //button到父視圖Top的距離
            CGFloat buttonToViewTop = 7 + temp_k *(40 + 7);
            button.frame = ({
                CGRect frame = CGRectMake(buttonToViewLeft,buttonToViewTop, buttonWigth, 40);
                frame;
            });
        }
        temp_i = temp_i+1; temp_k =  floor(temp_i/ 3.0);
        [button setTitle:model.addressName  forState:UIControlStateNormal];
    }
    //判斷是否最后一個(gè)button
    if (temp_k == temp_count_k) {
        CGRect frame = [self viewWithTag:100 + temp_i - 1].frame;
        CGFloat height = CGRectGetMaxY(frame);
        [self.contentView mas_updateConstraints:^(MASConstraintMaker *make) {
         //固定contentView的高度高度
            make.height.equalTo(@(height + 7));
        }];
    }
}

因?yàn)槲矣玫?strong>FDTemplateLayoutCell ,在這里我的cell只要在內(nèi)部將contenview撐起來(lái)就可以實(shí)現(xiàn)自適應(yīng)高度了

  • 2.關(guān)于如何實(shí)現(xiàn)排序功能,我在這里使用的是第三方ZYPinYinSearch和ChineseString其他的我沒(méi)用過(guò),反正這2個(gè)用起來(lái)挺方便的
    使用ZYPinYinSearch的時(shí)候 要注意必須使用模型來(lái)保存這些地址 地址里必須設(shè)置紅色圈中的標(biāo)志
Paste_Image.png

模型要全部保存到一個(gè)數(shù)組里,就可以進(jìn)行排序了

    //獲取索引的首字母
    self.sectionArr = [ChineseString IndexArray:self.dataCahce];
    //對(duì)原數(shù)據(jù)進(jìn)行排序重新分組
    self.dataSource = [ChineseString LetterSortArray:self.dataCahce];//datacache全部保存的是自定義模型

因?yàn)槲疫@里是固定了熱門城市和當(dāng)前位置,故我在索引數(shù)組前增加了2個(gè)標(biāo)記

    [self.sectionArr insertObject:@"#" atIndex:0];
    [self.sectionArr insertObject:@"*" atIndex:0];
  • 3.關(guān)于如何實(shí)現(xiàn)searchBar,這步其實(shí)非常簡(jiǎn)單,在ZYPinYinSearch里有個(gè)代理方法
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    if (controller.searchBar.text.length != 0) {
        dispatch_queue_t queue = dispatch_queue_create("com.mmfishing.locationcontroller.searchbar", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            [self.dataSearch removeAllObjects];
            NSArray *ary = [NSArray new];
            ary = [ZYPinYinSearch searchWithOriginalArray:self.dataCahce
                                            andSearchText:controller.searchBar.text
                                  andSearchByPropertyName:@"addressName"];
            [self.dataSearch addObjectsFromArray:ary];
            dispatch_async(dispatch_get_main_queue(), ^{
                [controller.searchResultsTableView reloadData];
                for (UIView* v in self.displayController.searchResultsTableView.subviews) {
                    if ([v isKindOfClass: [UILabel class]] &&
                        [[(UILabel*)v text] isEqualToString:@"No Results"]) {
                        UILabel *label = (UILabel *)v;
                        label.text = @"沒(méi)有結(jié)果";
                        break;
                    }
                }
            });
        });
    }
    return NO;
}

在這里 我使用異步是因?yàn)檫@庫(kù)在搜索時(shí)會(huì)照成頁(yè)面卡頓,加上后的確是不這么卡了

最后 關(guān)于這里的第三方庫(kù)因?yàn)樾枨?我私自改過(guò),所以就不發(fā)給大家了,關(guān)于如何實(shí)現(xiàn)就這里都已貼出來(lái)了番刊,剩下的邏輯問(wèn)題大家自行思考了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泼橘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迈勋,死亡現(xiàn)場(chǎng)離奇詭異炬灭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)靡菇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門重归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厦凤,你說(shuō)我怎么就攤上這事鼻吮。” “怎么了较鼓?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵椎木,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我博烂,道長(zhǎng)香椎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任脖母,我火速辦了婚禮士鸥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谆级。我一直安慰自己,他們只是感情好讼积,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布肥照。 她就那樣靜靜地躺著,像睡著了一般勤众。 火紅的嫁衣襯著肌膚如雪舆绎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天们颜,我揣著相機(jī)與錄音吕朵,去河邊找鬼。 笑死窥突,一個(gè)胖子當(dāng)著我的面吹牛努溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阻问,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梧税,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起第队,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凳谦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尸执,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡家凯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剔交。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岖常,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竭鞍,到底是詐尸還是另有隱情板惑,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布偎快,位于F島的核電站冯乘,受9級(jí)特大地震影響晒夹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丐怯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梗搅。 院中可真熱鬧效览,春花似錦无切、人聲如沸丐枉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烫映。三九已至噩峦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間识补,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工祝辣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留切油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓澎胡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稚伍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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