Masonry 布局约束冲突

Masonry 布局约束冲突

在涉及一些自动布局的时候,使用Masonry 布局会起到事半功倍的效果,本人觉得比苹果的原生的自动布局约束好使用,但是会遇到各种各样的约束冲突。少量的约束冲突对性能影响不大,但是作为一名程序猿,不得有半点的马虎,很小的一个问题都会影响app的性能。当约束冲突很多的时候,就会造成内存的增加,到达某一个临界值的时候,有可能会是APP崩溃。所以精益求精,尽量减少,或者没有约束冲突是最好的追求。

本人就在大量使用cell的时候遇到大量的约束冲突。

发送环境

封装一个控件,想让其内部自己改变自己的状态。使用Masonry 很方便,但是当时内部确实是自动适应。所有的布局没有问题,确有一堆约束冲突。

查找原因

是因为外部两次约束 该空间的宽度。

比如:

Masonry 布局约束冲突_第1张图片
图1

图1,该方法是暴露给外面刷新数据的,并且自动修改宽度。

图2

图2,而在外面其他地方,又一次去动态修改该空间的宽度

所以会有约束冲突

2017-03-01 18:14:53.467635 YXLiveVideoApp[599:142306] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "",
    "",
    "",
    ""
)

Will attempt to recover by breaking constraint 

解决办法

1、删除 图2 代码,解决约束冲突。

2、设置约束优先级。

/**
 *  Sets the NSLayoutConstraint priority to a float or MASLayoutPriority
 */
- (MASConstraint * (^)(MASLayoutPriority priority))priority;

/**
 *  Sets the NSLayoutConstraint priority to MASLayoutPriorityLow
 */
- (MASConstraint * (^)())priorityLow;

/**
 *  Sets the NSLayoutConstraint priority to MASLayoutPriorityMedium
 */
- (MASConstraint * (^)())priorityMedium;

/**
 *  Sets the NSLayoutConstraint priority to MASLayoutPriorityHigh
 */
- (MASConstraint * (^)())priorityHigh;

比如:

[self.trueLoveRegimentalView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(300).priorityHigh;
        }];

优先级默认是 中等

总结:

在需要根据数据动态改变空间的大小的时候,本人认为优选方案,控件内部根据数据刷新去动态改变控件大小。外部只需要关心控件的 位置需要放在那里。

这样就不需要外面使用的时候关心大小。类似于 UILabel 自动伸缩。

你可能感兴趣的:(Masonry 布局约束冲突)