? ? ? ? 應(yīng)該很長時間了,朋友給了一個項目源碼夭委,讓我從中學(xué)習(xí)一下幅狮。之前看他的項目的時候感覺邏輯很復(fù)雜,也不知道用的什么設(shè)計模式闰靴。感覺他就是把很復(fù)雜的View自己封裝了一下,然后留出本視圖和父視圖交互的方法钻注。
? ? ? ? 可能是機(jī)遇的問題蚂且,一直沒有遇到很復(fù)雜的界面,技術(shù)成長的也很慢幅恋。在現(xiàn)在的公司杏死,剛完成了一個小小項目。老板讓UI給了設(shè)計圖,讓我按著設(shè)計圖改淑翼。在這過程中雖然要改的很多腐巢,有的功能可能需要重寫。很高興玄括,也暴露出了自己的水平冯丙,改了一個界面,認(rèn)認(rèn)真的改了半天遭京,把之前的刪了胃惜,按設(shè)計的重新寫。
? ? ? ? 我封裝的小視圖是下面帶有藍(lán)色按鈕的那個視圖哪雕,那四個按鈕放在了一個View里面船殉,然后和黑色透明的部分一起放到封裝的view里面。
很low的小小項目圖片
子視圖與父視圖交互使用Block斯嚎,在要瘋轉(zhuǎn)的子視圖中添加了一個block屬性利虫。
?@property (nonatomic, copy)void(^OrderBtnAction)(UIButton *btn);
我選擇了根據(jù)按鈕的題目創(chuàng)建按鈕
- (instancetype) initWithFrame:(CGRect)frame AndBtnTitles:(NSArray *)titles;
在.m文件中,我聲明了一個數(shù)組btnArray來存放各個按鈕堡僻,以后用用這些按鈕糠惫,把他們設(shè)置為非選中狀態(tài),還聲明了一個數(shù)組的個數(shù)btnNum苦始,(現(xiàn)在看來是不需要這個屬性了)
@property (nonatomic, assign) NSInteger btnNum;
@property?(nonatomic,?strong)?NSMutableArray?*btnArray;
然后就是方法的實現(xiàn)了
- (instancetype)initWithFrame:(CGRect)frame AndBtnTitles:(NSArray *)titles {
self.btnNum = titles.count;
按鈕的款
CGFloat btnWidth = kSize(55);
按鈕的高
CGFloat btnHeight = kSize(20);
左側(cè)按鈕距離邊界的距離
CGFloat margin = kSize(8);
按鈕之間的距離 ?
CGFloat space = (frame.size.width - titles.count * btnWidth - margin * 2) / (titles.count - 1);
CGFloat positionX = frame.origin.x;
CGFloat positionY = frame.origin.y;
先設(shè)置陰影背景
if (self = [super initWithFrame:CGRectMake(frame.origin.x, frame.origin.y,? kScreenW - positionX,? kScreenH-positionY)]) {
self.backgroundColor = kUIColorFromRGBA(0x000000, 0.4);
再創(chuàng)建承載按鈕的view
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
view.backgroundColor = kUIColorFromRGB(0xf3f3f3);
[self addSubview:view];
然后循環(huán)創(chuàng)建按鈕了
for (int i = 0; i < titles.count; i ++) {
UIButton *btn = [[UIButton alloc] init];
[view addSubview:btn];
還使用了Masonry布局
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(margin + (btnWidth + space)*i);
make.centerY.mas_equalTo(0);
make.size.mas_equalTo(CGSizeMake(btnWidth, btnHeight));
}];
[btn setTitle:titles[i] forState:UIControlStateNormal];
[btn setTitle:titles[i] forState:UIControlStateSelected];
btn.titleLabel.font = [UIFont systemFontOfSize:kSize(13)];
[btn setTitleColor:kUIColorFromRGB(0x666666) forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
設(shè)置按鈕的背景色寞钥,后面有些
[btn setBackgroundColor:kUIColorFromRGB(0x29a0f3) forState:UIControlStateSelected];
非選中后clear顏色就沒喲圓角框框了
[btn setBackgroundColor:[UIColor clearColor] forState:UIControlStateNormal];
主頁面會根據(jù)這個i刷新相應(yīng)類型的數(shù)據(jù)的
btn.tag = i;
btn.layer.borderWidth = 0;
btn.layer.cornerRadius = 3;
btn.clipsToBounds = YES;
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
默認(rèn)第一個是選中狀態(tài)的
if (i == 0) {
btn.selected = YES;
}
[self.btnArray addObject:btn];
}
}
return self;
}
當(dāng)出發(fā)一個按鈕事件時,向?qū)⑵渌陌粹o變?yōu)榉沁x中狀態(tài)陌选,然后將本按鈕設(shè)為選中狀態(tài)理郑。
- (void)btnAction:(UIButton *)sender {
for (int i = 0; i < self.btnNum; i ++) {
((UIButton *)self.btnArray[i]).selected = NO;
}
將本按鈕發(fā)給主視圖
self.OrderBtnAction(sender);
}
- (NSMutableArray *)btnArray {
if(_btnArray == nil) {
_btnArray = [[NSMutableArray alloc] init];
}
return _btnArray;
}
在使用時 創(chuàng)建視圖
_orderView = [[JKXOrderView alloc] initWithFrame:CGRectMake(0, kSize(40), kScreenWidth, kSize(36)) AndBtnTitles:@[@"時間降序", @"時間升序", @"重要降序", @"重要升序"]];
先隱藏
_orderView.hidden?=?YES;
[self.view?addSubview:_orderView];
__block?typeof(self)?bself?=?self;
點擊按鈕后
self.orderView.OrderBtnAction?=?^(UIButton?*btn){
[bself.orderBtn?setTitle:@[@"時間降序",?@"時間升序",?@"重要降序",?@"重要升序"][btn.tag]?forState:UIControlStateNormal];
設(shè)置標(biāo)簽內(nèi)容
bself.classIndex?=?btn.tag;
然后刷新了數(shù)據(jù)
[bself.tableView.mj_header?beginRefreshing];
將本按鈕設(shè)為選中,選中狀態(tài)底色為藍(lán)色
btn.selected?=?YES;
然后隱藏自己的視圖
bself.orderView.hidden?=?YES;
和那個三角
bself.triangleView.hidden?=?YES;
根據(jù)狀態(tài)設(shè)置按鈕背景色寫了一個小分類
- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state {
[self?setBackgroundImage:[UIButton?imageWithColor:backgroundColor]?forState:state];
}
畫一個帶顏色的小圖片
+(UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
我的十六進(jìn)制顏色宏
#define kUIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
//?帶透明度是十六進(jìn)制顏色
#define?kUIColorFromRGBA(rgbValue,a)?[UIColor?colorWithRed:((float)((rgbValue?&?0xFF0000)?>>?16))/255.0?green:((float)((rgbValue?&?0xFF00)?>>?8))/255.0?blue:((float)(rgbValue?&?0xFF))/255.0?alpha:(a)]
寫完了咨油,不知道別人能不能看懂您炉,感覺我表達(dá)有問題地的歡迎提意見,我自己是找不到的役电。
還是希望有同行的大牛幫忙指點指點赚爵,感激不盡。公司只有我自己法瑟,不知道和誰交流呢冀膝。