美文网首页
Masonry常见使用

Masonry常见使用

作者: 文子飞_ | 来源:发表于2021-03-08 18:21 被阅读0次

    Masonry——父视图内容,自适应子视图。(view高度自适应)

    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.view.backgroundColor = [UIColor whiteColor];
    
        UIView *container = [UIView new];
        [self.view addSubview:container];
        container.backgroundColor = [UIColor blueColor];
        [container mas_makeConstraints:^(MASConstraintMaker *make) {
            //高度自适应,由子view的高度决定。此处切勿设置高度约束。
            make.top.equalTo(self.view).offset(100);
    
            make.left.equalTo(self.view).offset(10);
            make.right.equalTo(self.view).offset(-10);
        }];
    
        UIView *subView = [UIView new];
        [container addSubview:subView];
        subView.backgroundColor = [UIColor orangeColor];
        [subView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(container).offset(10);
            make.height.equalTo(@200);
            make.left.equalTo(container).offset(10);
            make.right.equalTo(container).offset(-10);
    
            //用于撑开container。注意不要设置container高度相关的约束。
            make.bottom.equalTo(container).offset(-10);
        }];
    
    }
    
    @implementation TitleView
    - (void)initSubViews
    {
        [self addSubview:self.containerView];
        [self.containerView addSubview:self.titleLabel];
        [self.containerView addSubview:self.countLabel];
    }
    
    - (void)addConstraints
    {
        [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.mas_equalTo(self);
        }];
        [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.containerView);
            make.bottom.mas_equalTo(self.containerView);
        }];
        [self.countLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.titleLabel.mas_right).offset(5);
            make.bottom.mas_equalTo(self.titleLabel).offset(4);
            make.right.mas_equalTo(self.containerView.mas_right);
        }];
    }
    @end
    
    - (void)addConstraints
    {
        [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self).offset(40);
            make.top.mas_equalTo(self);
            make.height.mas_equalTo(30);
    //        make.width.mas_equalTo(titleViewWidth);
        }];
    }
    

    Masonry——tableHeaderView 自适应高度。

    @implementation RefundStateView
    - (void)initSubViews
    {
        self.backgroundColor = [UIColor clearColor];
        self.containerView.backgroundColor = [UIColor whiteColor];
        [self addSubview:self.containerView];
        [self.containerView addSubview:self.refundProgressView];
        [self.containerView addSubview:self.stateTitleLabel];
        [self.containerView addSubview:self.stateDetailLabel];
        [self.containerView addSubview:self.noticeButton];
    }
    
    - (void)didMoveToSuperview
    {
        [super didMoveToSuperview];
        if (self.superview) {
            [self mas_makeConstraints:^(MASConstraintMaker *make) {
                make.width.mas_equalTo(SCREEN_WIDTH);
                make.bottom.mas_equalTo(self.containerView);
            }];
            [self layoutIfNeeded];
        }
    }
    
    - (void)addConstraints
    {
        [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.leading.trailing.mas_equalTo(self);
            make.bottom.mas_equalTo(self.noticeButton).offset(15);
        }];
        [self.refundProgressView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.leading.trailing.mas_equalTo(self.containerView);
            make.top.mas_equalTo(self.containerView).offset(15);
            make.height.mas_equalTo(48);
        }];
        [self.stateTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.refundProgressView.mas_bottom).offset(20);
            make.leading.trailing.mas_equalTo(self.containerView).inset(15);
            make.height.mas_equalTo(20);
        }];
        [self.stateDetailLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.stateTitleLabel.mas_bottom).offset(15);
            make.leading.trailing.mas_equalTo(self.containerView).inset(60);
            //make.height.mas_equalTo(15);
        }];
        [self.noticeButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.stateDetailLabel.mas_bottom).offset(10);
            make.leading.trailing.mas_equalTo(self.containerView).inset(15);
            make.height.mas_equalTo(40);
        }];
    }
    
    - (void)setRefundDetailModel:(WSFRefundDetailModel *)refundDetailModel
    {
        // 2、Label涉及到定时器显示文字时,必须要先给个默认值。不然整个tableHeaderView高度不准确
        // @"4天23时56分58秒后未审核系统将默认同意款"
        self.stateDetailLabel.text = @"--";
        self.refundProgressView.refundProgress = RefundProgressBegin;
                
        _hoursCountDown = [WSFHoursCountDown scheduledTimerWithTimeInterval:9988 handler:^(NSString * _Nonnull timeString) {
                    NSString *string = [NSString stringWithFormat:@"%@后未审核系统将默认同意款", timeString];
                    self.stateDetailLabel.text = string;
                    NSLog(@"currentThread = %@", [NSThread currentThread])
                    NSMutableAttributedString *attributed = [self setAttributeWithColor:UIColorHex(#FF6666) string:string rangeOfString:timeString];
                    self.stateDetailLabel.attributedText = attributed;
         }];
    
        // 3、containerView内容视图调整
        [self layoutIfNeeded];
        [self setNeedsDisplay];
    
        if (refundDetailModel.refundDetailModelState == RefundDetailModelCustomerAgreeAllState) {
            // 头部:退款状态(有通知)
            //self.noticeButton.hidden = NO;
            [self.containerView addSubview:self.noticeButton];
            [self.noticeButton mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.stateDetailLabel.mas_bottom).offset(10);
                make.leading.trailing.mas_equalTo(self.containerView).inset(15);
                make.height.mas_equalTo(40);
            }];
            [self.containerView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.leading.trailing.mas_equalTo(self);
                make.bottom.mas_equalTo(self.noticeButton).offset(15);
            }];
        } else {
            // 头部:退款状态(无通知)
            //self.noticeButton.hidden = YES;
            [self.containerView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.leading.trailing.mas_equalTo(self);
                make.bottom.mas_equalTo(self.stateDetailLabel).offset(15);
            }];
        }
    }
    
    @end
    
    @implementation RefundDetailVC
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 1、必须先给refundStateView赋值
        self.refundStateView.refundDetailModel = self.refundDetailViewModel.refundDetailModel;
        // 4、再设置tableHeaderView
        self.tableView.tableHeaderView = self.refundStateView;
    }
    
    #pragma mark - Getters and Setters
    - (WSFRefundStateView *)refundStateView {
        if (!_refundStateView) {
            _refundStateView = [[WSFRefundStateView alloc] init];
            _refundStateView.frame = CGRectMake(0, 0, SCREEN_WIDTH, 150);
        }
        return _refundStateView;
    }
    @end
    
    // MARK: - Swift
    class MeTableHeaderView: UIView {
        
        lazy var meView: MeView = {
            let meView = MeView()
            return meView
        }()
        
        lazy var titleLabel: UILabel = {
            let titleLabel = UILabel.label(font: kFont13, textColor: kRandomColor())
            titleLabel.numberOfLines = 0
            return titleLabel
        }()
        
        lazy var randomButton: UIButton = {
            let randomButton = UIButton.button(font: kFont15, textColor: kRandomColor(), title: "随机按钮")
            return randomButton
        }()
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            initSubViews()
            addConstraints()
        }
        
        override func layoutSubviews() {
            super.layoutSubviews()
        }
        
        override func didMoveToSuperview() {
            super.didMoveToSuperview()
            if (superview != nil) {
                snp.remakeConstraints { (make) in
                    //make.width.equalTo(superview!)
                    make.width.equalTo(kScreenWidth)
                    make.bottom.equalTo(randomButton)
                }
                layoutIfNeeded()
            }
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func initSubViews() {
            self.addSubview(meView)
            self.addSubview(titleLabel)
            self.addSubview(randomButton)
            meView.showBlueLayer()
            titleLabel.showOrangeLayer()
            randomButton.showBlackLayer()
        }
        
        func addConstraints() {
            meView.snp.makeConstraints { (make) in
                make.top.leading.trailing.equalTo(self)
                make.bottom.equalTo(meView.titleLabel)
            }
            titleLabel.snp.makeConstraints { (make) in
                make.top.equalTo(meView.snp.bottom)
                make.leading.trailing.equalTo(self)
            }
            randomButton.snp.makeConstraints { (make) in
                make.top.equalTo(titleLabel.snp.bottom)
                make.leading.trailing.equalTo(self)
                make.height.equalTo(45)
            }
    //        self.snp.makeConstraints { (make) in
    //            make.bottom.equalTo(randomButton)
    //        }
        }
        
    }
    
    class MeVC: BaseVC {
        lazy var headerView: MeTableHeaderView = {
            let headerView = MeTableHeaderView()
            headerView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: 200)
            let string = "arc4random_uniform需要一个UInt32类型的参数n,返回一个0 到 n - 1之间的一个类型为UInt32的整数。这种写法相对于第一种来说更安全,具体原因,请参考这里"
            headerView.meView.titleLabel.text = string
            headerView.titleLabel.text = string
            return headerView
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            meTableView.delegate = self
            meTableView.dataSource = self
            meTableView.rowHeight = 200
            meTableView.estimatedRowHeight = 200
            meTableView.tableHeaderView = headerView
            
    //        meTableView.tableHeaderView?.layoutIfNeeded()
    //        headerView.layoutIfNeeded()
    //        headerView.snp.makeConstraints { (make) in
    //            make.width.equalTo(kScreenWidth)
    //            make.bottom.equalTo(headerView.randomButton)
    //        }
        }
    
    }
    
    

    Masonry——for循环,创建多个view视图。

    - (void)addRightButtons:(NSArray<UIButton *> *)buttons
    {
        [self layoutIfNeeded];
        [self setNeedsLayout];
        
        UIButton *tempButton;
        for (int i = 0; i < buttons.count; i++) {
            UIButton *button = buttons[i];
            button.tag = i;
            [self addSubview:button];
            [button mas_makeConstraints:^(MASConstraintMaker *make) {
                make.size.mas_equalTo(CGSizeMake(30, 30));
                make.centerY.equalTo(self.backButton);
                if (!tempButton) {
                    make.trailing.mas_equalTo(self.rightButton.mas_leading).inset(8);
                } else {
                    make.trailing.mas_equalTo(tempButton.mas_leading).inset(8);
                }
            }];
            tempButton = button;
        }
        [self.tempArrays appendObjects:buttons];
    }
    

    相关文章

      网友评论

          本文标题:Masonry常见使用

          本文链接:https://www.haomeiwen.com/subject/oxfmqltx.html