iOS開發(fā) | 看待view要像看待模塊一樣

Yoona

背景

最近產(chǎn)品部門提了一點(diǎn)需求荧嵌,修改了一下“選擇收貨時(shí)間”頁(yè)面呛踊,我也因此回顧了一下前年(16年)寫的代碼指蚜,不得不說鸽扁,太臭了苟呐。

詳情

如圖:

這里面有個(gè)溫馨提示view:

展示數(shù)據(jù)來自后臺(tái)低斋,這里只是一條數(shù)據(jù),其實(shí)有可能是多條數(shù)據(jù)蜻底,如:

多條數(shù)據(jù)

16年的做法

那個(gè)時(shí)候我對(duì)MVC的理解還不到位骄崩,這種模塊view我都是一口氣寫到控制器里的。

或許你覺得這個(gè)view并不復(fù)雜薄辅,但是寫個(gè)上百行代碼還是沒問題的要拂。

現(xiàn)在的做法

將這個(gè)view看作一個(gè)模塊,然后抽離出來站楚。代碼文件如下:

總共分成了三個(gè)類:

1. CQPickTimeAlertModel

@interface?CQPickTimeAlertModel?:?NSObject

/**?標(biāo)題?*/

@property?(nonatomic,?copy)?NSString?*title;

/**?內(nèi)容?*/

@property?(nonatomic,?copy)?NSString?*desc;

@end

2. CQPickTimeAlertItem

對(duì)應(yīng)一個(gè)model脱惰,它的表現(xiàn)形式如下:

item

.h文件:

@interface?CQPickTimeAlertItem?:?UIView

@property?(nonatomic,?strong)?CQPickTimeAlertModel?*model;

@end

.m文件:

@interface?CQPickTimeAlertItem?()

@property?(nonatomic,?strong)?UILabel?*titleLabel;

@property?(nonatomic,?strong)?UILabel?*descLabel;

@end

@implementation?CQPickTimeAlertItem

-?(instancetype)initWithFrame:(CGRect)frame?{

????if?(self?=?[super?initWithFrame:frame])?{

????????[self?setUpUI];

????}

????return?self;

}

-?(void)setUpUI?{

????self.titleLabel?=?[[UILabel?alloc]?init];

????[self?addSubview:self.titleLabel];

????self.titleLabel.font?=?[UIFont?systemFontOfSize:10];

????self.titleLabel.textColor?=?[UIColor?redColor];

????self.titleLabel.textAlignment?=?NSTextAlignmentCenter;

????self.titleLabel.layer.cornerRadius?=?3;

????self.titleLabel.layer.borderWidth?=?1;

????self.titleLabel.layer.borderColor?=?[UIColor?redColor].CGColor;



????self.descLabel?=?[[UILabel?alloc]?init];

????[self?addSubview:self.descLabel];

????self.descLabel.font?=?[UIFont?systemFontOfSize:12];

????self.descLabel.textColor?=?[UIColor?orangeColor];

????self.descLabel.numberOfLines?=?0;


????[self?bringSubviewToFront:self.titleLabel];

}

-?(void)setModel:(CQPickTimeAlertModel?*)model?{

????_model?=?model;


????self.titleLabel.text?=?_model.title;

????self.descLabel.text??=?_model.desc;


????[self?layoutIfNeeded];

}

-?(void)layoutSubviews?{

????[super?layoutSubviews];


????[self.titleLabel?sizeToFit];

????self.titleLabel.frame?=?CGRectMake(0,?0,?self.titleLabel.frame.size.width?+?6,?self.titleLabel.frame.size.height?+?2);


????//?設(shè)置富文本:首行縮進(jìn)

????NSMutableParagraphStyle?*style?=?[[NSMutableParagraphStyle?alloc]init];

????style.firstLineHeadIndent?=?self.titleLabel.frame.size.width?+?4;

????NSMutableAttributedString?*attrString?=?[[NSMutableAttributedString?alloc]?initWithString:self.descLabel.text];

????[attrString?addAttribute:NSParagraphStyleAttributeName?value:style?range:NSMakeRange(0,?self.titleLabel.text.length)];


????self.descLabel.attributedText?=?attrString;


????self.descLabel.frame?=?CGRectMake(0,?0,?self.frame.size.width,?30);

????[self.descLabel?sizeToFit];


????self.frame?=?CGRectMake(self.frame.origin.x,?self.frame.origin.y,?self.frame.size.width,?CGRectGetMaxY(self.descLabel.frame));

}

@end

3. CQPickTimeAlertView

也就是這整個(gè)的模塊view:

.h文件:

@interface?CQPickTimeAlertView?:?UIView

@property?(nonatomic,?strong)?NSArray?*itemsArray;

@end

.m文件:

@implementation?CQPickTimeAlertView

-?(instancetype)initWithFrame:(CGRect)frame?{

????if?(self?=?[super?initWithFrame:frame])?{

????????[self?setUpUI];

????}

????return?self;

}

-?(void)setUpUI?{

????UILabel?*titleLabel?=?[[UILabel?alloc]?initWithFrame:CGRectMake(5,?5,?100,?30)];

????[self?addSubview:titleLabel];

????titleLabel.text?=?@"溫馨提示";

????titleLabel.font?=?[UIFont?systemFontOfSize:14];

????titleLabel.textColor?=?[UIColor?greenColor];

}

-?(void)setItemsArray:(NSArray?*)itemsArray?{

????_itemsArray?=?itemsArray;


????UIView?*lastView?=?nil;


????for?(int?i?=?0;?i?<?_itemsArray.count;?i?++)?{

????????CQPickTimeAlertItem?*itemView?=?[[CQPickTimeAlertItem?alloc]?init];

????????[self?addSubview:itemView];

????????if?(!lastView)?{

????????????itemView.frame?=?CGRectMake(5,?40,?self.frame.size.width-10,?0);

????????}?else?{

????????????itemView.frame?=?CGRectMake(5,?CGRectGetMaxY(lastView.frame)?+?5,?self.frame.size.width-10,?0);

????????}

????????itemView.model?=?_itemsArray[i];

????????lastView?=?itemView;

????}


????//?調(diào)整自身高度

????self.frame?=?CGRectMake(self.frame.origin.x,?self.frame.origin.y,?self.frame.size.width,?CGRectGetMaxY(lastView.frame)+10);


????//?虛線邊框

????CAShapeLayer?*imaginaryLine?=?[CAShapeLayer?layer];

????imaginaryLine.frame?=?CGRectMake(0,?0,?self.frame.size.width,?self.frame.size.height);

????imaginaryLine.path?=?[UIBezierPath?bezierPathWithRoundedRect:self.bounds?cornerRadius:0].CGPath;

????imaginaryLine.lineWidth?=?1.?/?[[UIScreen?mainScreen]?scale];

????imaginaryLine.lineDashPattern?=?@[@2,?@2];

????imaginaryLine.fillColor?=?[UIColor?clearColor].CGColor;

????imaginaryLine.strokeColor?=?[UIColor?grayColor].CGColor;

????[self.layer?addSublayer:imaginaryLine];

}

@end

注:以上是我demo里的代碼,沒有用任何三方或category窿春,命名也比較隨意拉一,大家就別吐槽了。主要看思路旧乞。

相比16年的代碼有何進(jìn)步蔚润?

極大的減少了C層的代碼,更加簡(jiǎn)潔及優(yōu)雅尺栖。

現(xiàn)在創(chuàng)建這個(gè)模塊只需幾行代碼:

CQPickTimeAlertView?*aview?=?[[CQPickTimeAlertView?alloc]?initWithFrame:CGRectMake(50,?100,?self.view.frame.size.width?-?100,?20)];

[self.view?addSubview:aview];

aview.itemsArray?=?modelsArray;

分層更清晰了修改自然也就更容易了嫡纠。

有用的知識(shí)點(diǎn)

1.首行縮進(jìn):

NSMutableParagraphStyle?*style?=?[[NSMutableParagraphStyle?alloc]init];

style.firstLineHeadIndent?=?self.titleLabel.frame.size.width?+?4;

這個(gè)很關(guān)鍵,要不然處理下面這兩個(gè)label的時(shí)候你可能會(huì)走彎路延赌。

2.虛線邊框

用CAShapeLayer:

CAShapeLayer?*imaginaryLine?=?[CAShapeLayer?layer];

imaginaryLine.frame?=?CGRectMake(0,?0,?self.frame.size.width,?self.frame.size.height);

imaginaryLine.path?=?[UIBezierPath?bezierPathWithRoundedRect:self.bounds?cornerRadius:0].CGPath;

imaginaryLine.lineWidth?=?1.?/?[[UIScreen?mainScreen]?scale];

imaginaryLine.lineDashPattern?=?@[@2,?@2];

imaginaryLine.fillColor?=?[UIColor?clearColor].CGColor;

imaginaryLine.strokeColor?=?[UIColor?grayColor].CGColor;

[self.layer?addSublayer:imaginaryLine];

總結(jié)

看待view要像看待模塊一樣除盏;

對(duì)待裝備要像對(duì)待情人一樣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挫以,一起剝皮案震驚了整個(gè)濱河市者蠕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掐松,老刑警劉巖踱侣,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異大磺,居然都是意外死亡泻仙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門量没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人突想,你說我怎么就攤上這事殴蹄【孔ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵袭灯,是天一觀的道長(zhǎng)刺下。 經(jīng)常有香客問我,道長(zhǎng)稽荧,這世上最難降的妖魔是什么橘茉? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮姨丈,結(jié)果婚禮上畅卓,老公的妹妹穿的比我還像新娘。我一直安慰自己蟋恬,他們只是感情好翁潘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歼争,像睡著了一般拜马。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐绒,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天俩莽,我揣著相機(jī)與錄音,去河邊找鬼乔遮。 笑死扮超,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的申眼。 我是一名探鬼主播瞒津,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼括尸!你這毒婦竟也來了巷蚪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤濒翻,失蹤者是張志新(化名)和其女友劉穎屁柏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體有送,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淌喻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雀摘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裸删。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阵赠,靈堂內(nèi)的尸體忽然破棺而出涯塔,到底是詐尸還是另有隱情肌稻,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布匕荸,位于F島的核電站爹谭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏榛搔。R本人自食惡果不足惜诺凡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望践惑。 院中可真熱鬧腹泌,春花似錦、人聲如沸童本。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穷娱。三九已至绑蔫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泵额,已是汗流浹背配深。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫁盲,地道東北人篓叶。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像羞秤,于是被迫代替她去往敵國(guó)和親缸托。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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