iOS 開發(fā) masonry九宮格 知押、彈框布局

首先看下效果圖:


17C12286-8174-4917-8824-BB4FC2C155AC.png
6438432E-E8E5-4F7C-9637-585F877C1E65.png
A4364707-4CEB-4782-AE8F-786487EF1E46.png

當小于三行是不可滑動,大于可滑動鹃骂。背景View的最大高度是有限制的台盯。

當前界面使用到了計算高度的宏定義

#define PXW(x)                  (x / 750.f * kScreenWidth)

根據(jù)效果圖需要定義背景View,標題Label偎漫,下劃線View爷恳,還有可以滑動的UIScrollView。定義所需的基本的控件以及創(chuàng)建:

@property (nonatomic, weak) UIView                      *backgroundView;
@property (nonatomic, weak) UILabel                     *titleLabel;
@property (nonatomic, weak) UIView                      *lineView;
@property (nonatomic, weak) UIScrollView                *scrollView;


- (UIView *)backgroundView {
    if (!_backgroundView) {
        UIView *view = [[UIView alloc] init];
        view.backgroundColor = [UIColor whiteColor];
        view.layer.masksToBounds = YES;
        view.layer.cornerRadius = 3.f;
        [self addSubview:view];
        _backgroundView = view;
    }
    return _backgroundView;
}

- (UILabel *)titleLabel {
    if (!_titleLabel) {
        UILabel *label = [[UILabel alloc] init];
        label.textColor = Color_45b245;
        label.font = [UIFont systemFontOfSize:PXW(26.f)];
        label.text = @"冷庫規(guī)模";
        [self.backgroundView addSubview:label];
        _titleLabel = label;
    }
    return _titleLabel;
}

- (UIView *)lineView {
    if (!_lineView) {
        UIView *view = [[UIView alloc] init];
        view.backgroundColor = Color_b1b1b1;
        [self.backgroundView addSubview:view];
        _lineView = view;
    }
    return _lineView;
}

- (UIScrollView *)scrollView {
    if (!_scrollView) {
        UIScrollView *view = [[UIScrollView alloc] init];
        [self.backgroundView addSubview:view];
        _scrollView = view;
    }
    return _scrollView;
}

當點背景View以外的區(qū)域需要銷毀當前的View象踊,首先添加手勢代碼

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];
    tap.delegate = self;
    [self addGestureRecognizer:tap];

實現(xiàn)手勢代理方法銷毀自身温亲,但是點擊背景view上的空間不銷毀View視圖,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    NSLog(@"%@",NSStringFromClass([touch.view class]))
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UIView"] || [NSStringFromClass([touch.view class]) isEqualToString:@"UIScrollView"]) {
        //返回為NO則屏蔽手勢事件
        return NO;
    }
    return YES;
}
- (void)tapView:(UITapGestureRecognizer *)tapView {
    [self hiddenView];
}
- (void)hiddenView {
    [self removeAllSubviews];
    [self removeFromSuperview];
}

下面為基本布局的UI代碼

[self.backgroundView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.mas_right).offset(PXW(-74.f)).priorityHigh();
        make.left.equalTo(self.mas_left).offset(PXW(74.f));
        make.centerY.equalTo(self.mas_centerY);
        make.height.mas_lessThanOrEqualTo(PXW(462.f)).priorityHigh();
    }];
    [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.backgroundView.mas_right).offset(PXW(-30.f)).priorityHigh();
        make.left.equalTo(self.backgroundView.mas_left).offset(PXW(30.f));
        make.top.equalTo(self.backgroundView.mas_top).offset(PXW(31.f));
    }];
    [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.left.equalTo(self.backgroundView);
        make.top.equalTo(self.titleLabel.mas_bottom).offset(PXW(31.f));
        make.height.mas_equalTo(PXW(1.f));
    }];
    [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.left.equalTo(self.titleLabel);
        make.top.equalTo(self.lineView.mas_bottom).offset(PXW(20.f));
        make.bottom.equalTo(self.backgroundView.mas_bottom).offset(PXW(-20.f));
    }];

下面為實現(xiàn)九宮格的代碼杯矩,使用了RAC第三方庫

- (RACSubject *)showArray:(NSArray *)array viewTitle:(NSString *)title {
    RACSubject *subject = [RACSubject subject];
    UIView *view = [[[UIApplication sharedApplication] delegate] window];
    self.frame = view.frame;
    [view addSubview:self];
    [self.scrollView layoutIfNeeded];
   if (title.length) {
        self.titleLabel.text = title;
    }
    NSInteger colInt = 3;//每行3個
    NSInteger bottomHeight = PXW(20.f);//button距離底部的距離
    CGFloat leftMrgin = PXW(20.f);//左間距
    CGFloat buttonWidth = (self.scrollView.frame.size.width - (colInt + 1)*PXW(20.f))/colInt;//每個button的寬度
    CGFloat buttonHeight = buttonWidth/154.f*90.f;//根據(jù)UI的寬高比計算高度
    UIButton *lastButton = nil;//適配參考button
    for (int i = 0; i < array.count; i ++) {
        LYColdStoreRefriDataInfo *dataInfo = array[I];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setTitle:dataInfo.name forState:UIControlStateNormal];
        button.layer.borderColor = Color_b1b1b1.CGColor;
        button.layer.borderWidth = PXW(1.f);
        [button setTitleColor:Color_a6a6a6 forState:UIControlStateNormal];
        button.titleLabel.font = [UIFont systemFontOfSize:PXW(26.f)];
        WEASELF(weakSelf)
        [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
            //點擊按鈕發(fā)送數(shù)據(jù)信號
            [subject sendNext:dataInfo];
            [weakSelf hiddenView];
        }];
        [self.scrollView addSubview:button];
        [button mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(buttonWidth);
            make.height.mas_equalTo(buttonHeight);
            //計算Top的高度值
            CGFloat top = (i / colInt) * (buttonHeight + bottomHeight);
            make.top.mas_offset(top);
            //當參考button為空或者為左邊第一個
            if(!lastButton || (i%colInt) == 0) {
                make.left.mas_offset(leftMrgin);
            } else {
                //根據(jù)參考的button適配
                make.left.mas_equalTo(lastButton.mas_right).mas_offset(leftMrgin);
            }
        }];
        //賦值button
        lastButton = button;
    }
    //計算scrollView的高度 并且設置優(yōu)先級為低 priorityLow 否則高度會超出View的高度
    NSInteger heightCount = array.count % colInt > 0 ? (array.count/colInt + 1) : (array.count/colInt);
    [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(heightCount * (buttonHeight + bottomHeight)).priorityLow();
        make.bottom.equalTo(self.scrollView.subviews.lastObject.mas_bottom);
    }];
    return subject;
}

LYColdStoreRefriDataInfo就是一個Model定義所需的屬性栈虚。

下面為view的使用

LYColdStoreAlertView *alert = [[LYColdStoreAlertView alloc] init];
    RACSubject *subject = [alert showArray:array viewTitle:view.titleLabel.text];
    [subject subscribeNext:^(id x) {
        LYColdStoreRefriDataInfo *dataInfo = (LYColdStoreRefriDataInfo *)x;
        view.textField.text = dataInfo.name;
    }];

小面展示的是效果圖,數(shù)據(jù)是從后臺獲取的


1D74AD45-4160-4E58-AE1D-B480D70152F1.png
68BAA439-8B8D-4DAE-B8D5-01820E433DED.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末史隆,一起剝皮案震驚了整個濱河市魂务,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泌射,老刑警劉巖粘姜,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熔酷,居然都是意外死亡孤紧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門拒秘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來号显,“玉大人臭猜,你說我怎么就攤上這事⊙涸椋” “怎么了蔑歌?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揽碘。 經(jīng)常有香客問我次屠,道長,這世上最難降的妖魔是什么钾菊? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任帅矗,我火速辦了婚禮,結(jié)果婚禮上煞烫,老公的妹妹穿的比我還像新娘浑此。我一直安慰自己,他們只是感情好滞详,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布凛俱。 她就那樣靜靜地躺著,像睡著了一般料饥。 火紅的嫁衣襯著肌膚如雪蒲犬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天岸啡,我揣著相機與錄音原叮,去河邊找鬼。 笑死巡蘸,一個胖子當著我的面吹牛奋隶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悦荒,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼唯欣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搬味?” 一聲冷哼從身側(cè)響起境氢,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碰纬,沒想到半個月后萍聊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡悦析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年寿桨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片她按。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡牛隅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酌泰,到底是詐尸還是另有隱情媒佣,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布陵刹,位于F島的核電站默伍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衰琐。R本人自食惡果不足惜也糊,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羡宙。 院中可真熱鬧狸剃,春花似錦、人聲如沸狗热。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匿刮。三九已至僧凰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熟丸,已是汗流浹背训措。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留光羞,地道東北人绩鸣。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像狞山,于是被迫代替她去往敵國和親全闷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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