iOS自定義ActionSheet封裝流程(轉(zhuǎn))

前言

本文為iOS自定義視圖封裝《一勞永逸》系列的第四期,旨在提供封裝思路徘禁,結(jié)果固然重要诅诱,但理解過程才最好。授人以魚不如授人以漁送朱,文章旨在幫助封裝程度較低的朋友們娘荡,大神可無視勿噴。

正文

最近更新項目需求驶沼,需要重構(gòu)導(dǎo)航選取模塊炮沐,故將封裝流程進(jìn)行分享,效果圖如下:

導(dǎo)航選取彈窗

根據(jù)效果圖情況回怜,可知標(biāo)題欄位置需自定義大年,且選項位置等文字樣式可調(diào)節(jié),因此無法利用系統(tǒng)的UIActionSheet或UIAlertController進(jìn)行實(shí)現(xiàn)玉雾,需自定義視圖翔试,并考慮到適用場景,該ActionSheet后續(xù)會用于其他功能模塊中复旬,所以要封裝成通用類垦缅。

繼續(xù)分析需求,用什么控件作為主體會更好呢驹碍?沒錯壁涎,UITableView是在適合不過了,見刨析圖:


刨析圖

如上設(shè)計的優(yōu)勢在于可將自定義View傳入做為TableView的表頭視圖tableHeaderView志秃。對于選項位置若需定制其它樣式可自定義Cell進(jìn)行設(shè)置怔球。因此可滿足自定義ActionSheet的多種場景。

根據(jù)刨析圖洽损,首先我們分別創(chuàng)建maskView與主體TableView庞溜。這里需注意的是為了實(shí)現(xiàn)效果我們需要將TableView的顏色置為透明。

_tableView.backgroundColor = [UIColor clearColor];

并且我們要將TableView分為兩組,即主體選項與取消按鈕分離流码,因此設(shè)置代理方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 2;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return (section == 0)?_optionsArr.count:1;

}

接下來進(jìn)行處理視圖的圓角效果又官。TableView主體做圓角效果這個不用多說,需要注意的是如何處理好TableViewCell的圓角形式漫试,若仍然簡單設(shè)置layer.cornerRadius會出現(xiàn)如下情況:

效果圖

顯然很難看六敬,設(shè)計看到估計會崩潰,因此我們需要做的處理為僅為選項中的最后一項做圓角處理驾荣,即圖中的高德地圖選項外构,并且為了美觀效果,要達(dá)到只為其左下角與右下角做處理播掷。

這里我們需要借助UIBezierPath與CAShapeLayer進(jìn)行實(shí)現(xiàn)审编。判斷是否為最后選項,然后進(jìn)行如下設(shè)置歧匈。

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:

cell.contentView.bounds byRoundingCorners:

UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:

CGSizeMake(10, 10)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];

maskLayer.frame = cell.contentView.bounds;

maskLayer.path = maskPath.CGPath;

cell.layer.mask = maskLayer;

其中byRoundingCorners即為設(shè)置所需處理邊角參數(shù)垒酬。有如下枚舉克進(jìn)行選擇:

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {

UIRectCornerTopLeft? ? = 1 << 0,

UIRectCornerTopRight? ? = 1 << 1,

UIRectCornerBottomLeft? = 1 << 2,

UIRectCornerBottomRight = 1 << 3,

UIRectCornerAllCorners? = ~0UL

};

比如將byRoundingCorners設(shè)置為UIRectCornerTopLeft| UIRectCornerBottomRight,即左上與右下設(shè)置件炉,View的效果為:


效果圖

經(jīng)過上述調(diào)整勘究,視圖的圓角效果完成,最后設(shè)置組尾透明視圖即可:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {

return SPACE;

}

- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {

UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, SPACE)];

footerView.backgroundColor = [UIColor clearColor];

return footerView;

}

做好如上處理后基本的UI效果即已完成斟冕。

接下來我們考慮外漏方法問題口糕,簡單模擬UIActionSheet的創(chuàng)建形式,公開方法:

- (instancetype)initWithTitleView:(UIView*)titleView

optionsArr:(NSArray*)optionsArr

cancelTitle:(NSString*)cancelTitle

selectedBlock:(void(^)(NSInteger))selectedBlock

cancelBlock:(void(^)())cancelBlock;

調(diào)用如下:

SureCustomActionSheet *optionsView = [[SureCustomActionSheet alloc]initWithTitleView:self.headView optionsArr:self.dataArr cancelTitle:@"取消" selectedBlock:^(NSInteger index) {

} cancelBlock:^{

}];

[self.view addSubview:optionsView];

這樣即可將所需頭視圖磕蛇、取消文字傳入景描,并處理選項事件等。

最后簡單給予視圖顯示與隱藏的效果秀撇,并在欠當(dāng)?shù)臅r機(jī)調(diào)用即可伏伯,且這里我們需要調(diào)節(jié)TableView的高度,使其適應(yīng)所包含內(nèi)容高度捌袜。

- (void)show {

_tableView.frame = CGRectMake(SPACE, Screen_height, Screen_Width - (SPACE * 2), _tableView.rowHeight * (_optionsArr.count + 1) + _headView.bounds.size.height + (SPACE * 2));

[UIView animateWithDuration:.5 animations:^{

CGRect rect = _tableView.frame;

rect.origin.y -= _tableView.bounds.size.height;

_tableView.frame = rect;

?}];

}

- (void)dismiss {

[UIView animateWithDuration:.5 animations:^{

CGRect rect = _tableView.frame;

rect.origin.y += _tableView.bounds.size.height;

_tableView.frame = rect;

} completion:^(BOOL finished) {

[self removeFromSuperview];

?}];

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {?

?? [self dismiss];

?}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event {

[self dismiss];

}

至此说搅,該需求效果已基本完成,如上摘取部分代碼虏等,demo已上傳github弄唧,需要可自行下載。

一勞永逸霍衫,iOS自定義ActionSheet封裝流程demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末候引,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敦跌,更是在濱河造成了極大的恐慌澄干,老刑警劉巖逛揩,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麸俘,居然都是意外死亡辩稽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門从媚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逞泄,“玉大人,你說我怎么就攤上這事拜效∨缰冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵紧憾,是天一觀的道長到千。 經(jīng)常有香客問我,道長赴穗,這世上最難降的妖魔是什么父阻? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮望抽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘履婉。我一直安慰自己煤篙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布毁腿。 她就那樣靜靜地躺著辑奈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪已烤。 梳的紋絲不亂的頭發(fā)上鸠窗,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音胯究,去河邊找鬼稍计。 笑死,一個胖子當(dāng)著我的面吹牛裕循,可吹牛的內(nèi)容都是我干的臣嚣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼剥哑,長吁一口氣:“原來是場噩夢啊……” “哼硅则!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起株婴,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤怎虫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體大审,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蘸际,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饥努。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捡鱼。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酷愧,靈堂內(nèi)的尸體忽然破棺而出驾诈,到底是詐尸還是另有隱情,我是刑警寧澤溶浴,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布乍迄,位于F島的核電站,受9級特大地震影響士败,放射性物質(zhì)發(fā)生泄漏闯两。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一谅将、第九天 我趴在偏房一處隱蔽的房頂上張望漾狼。 院中可真熱鬧,春花似錦饥臂、人聲如沸逊躁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稽煤。三九已至,卻和暖如春囚戚,著一層夾襖步出監(jiān)牢的瞬間酵熙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工驰坊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匾二,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓拳芙,卻偏偏與公主長得像假勿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子态鳖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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