前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS小经验·Masonry布局时因不熟悉Cell生命周期而导致死循环

iOS小经验·Masonry布局时因不熟悉Cell生命周期而导致死循环

作者头像
陈满iOS
发布2018-10-09 11:48:19
1.7K0
发布2018-10-09 11:48:19
举报
文章被收录于专栏:陈满iOS

本文属 iOS小经验系列:累积平时看起来简单,容易忽视的边边角角,各路大佬敬请回避。

设置UICollectionView的footer的时候,可能有新的小伙伴这样写:

问题代码:

  • 头文件
代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface DownloadCollectionFooter : UICollectionReusableView

/** 标题 */
@property (nonatomic,strong) UIButton * footerBtn;
/** 内存 */
@property (nonatomic,strong) NSString * footerStr;

@end
  • 实现文件
代码语言:javascript
复制
#import "DownloadCollectionFooter.h"
#import "Masonry.h"
@implementation DownloadCollectionFooter

- (instancetype)init
{
    self = [super init];
    if (self) {
         //...
    }
    return self;
}

- (void)layoutSubviews{
    
    [super layoutSubviews];
    _footerBtn = [[UIButton alloc]init];
    [_footerBtn setTitle:@"下载" forState:UIControlStateNormal];
    _footerBtn.titleLabel.font = [UIFont systemFontOfSize:15];
    [self addSubview:_footerBtn];
    
    [_footerBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.mas_left).offset(25);
        make.right.equalTo(self.mas_right).offset(-25);
        make.top.equalTo(self.mas_top).offset(7);
        make.height.mas_equalTo(@36);
    }];
}

问题描述

导致死循环地执行layoutSubviews代码。

问题原因

这是因为,通过Masonry设置约束之前的那个addSubview,会导致layoutSubviews再次执行。那么,如果你在layoutSubviews中设置addSubview,就导致死循环了。

解决方案

  • 在初始化的时候设置Masonry。例如下面初始化的时候调用自定义的initSubViews,然后把原来写在layoutSubviews的问题代码写在initSubViews中去。
代码语言:javascript
复制
-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        [self initSubViews];
    }
    return self;
}

如果你坚持想在layoutSubviews写布局代码,仍然可以,也有个方案:

  • 把addSubview写在初始化方法里面,或者写在子控件的懒加载里面,然后在layoutSubviews的方法里面再用Masonry设置布局约束。
  • 或者,改用frame和bounds等绝对布局方式,addSubview之后,再用绝对布局,并不会导致layoutSubviews再次执行,例如。
代码语言:javascript
复制
- (void)layoutSubviews{
    
    [super layoutSubviews];
    
    _titleLabel = [[UILabel alloc]init];
    [self addSubview:_titleLabel];
    _titleLabel.frame = CGRectMake(0, 7, SCREEN_WIDTH, 24);
    _titleLabel.centerX = self.centerX;
    _titleLabel.text = @"缓存";
    //等等
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档