使用Masonry布局调用mas_rightMargin触发未识别选择器崩溃求助
Masonry中
mas_rightMargin报错的原因及margin布局的正确用法 先看你遇到的问题:你在使用Masonry布局时,调用v2.mas_rightMargin导致了unrecognized selector崩溃,但换成v2.mas_right就正常了,这背后的原因其实是Masonry的属性封装逻辑。
报错的核心原因
Masonry并没有提供mas_rightMargin这个属性/方法,你调用了一个不存在的API,自然会触发崩溃。而mas_right是Masonry对UIView原生rightAnchor的封装,属于Masonry标准提供的布局属性,所以可以正常使用。
如何正确使用margin相关布局
如果你想基于视图的layoutMargins(也就是你给v2设置的UIEdgeInsetsMake(-20, -20, -20, -20))来做布局,需要通过视图的layoutMarginsGuide来获取对应的锚点,这也是苹果Auto Layout推荐的方式。
修改你的代码如下:
UIView *v2 = ({ UIView *view = [UIView new]; [self.view addSubview:view]; [view mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(50, 50)); make.left.equalTo(v1.mas_right); make.top.equalTo(v1.mas_bottom); }]; view.backgroundColor = [UIColor blueColor]; view.layoutMargins = UIEdgeInsetsMake(-20, -20, -20, -20); view; }); UIView *v3 = ({ UIView *view = [UIView new]; [self.view addSubview:view]; [view mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(50, 50)); make.centerY.equalTo(v2); // 正确的margin布局写法:通过layoutMarginsGuide访问right锚点 make.left.equalTo(v2.layoutMarginsGuide.mas_right); }]; view.backgroundColor = [UIColor redColor]; view; });
额外说明
- 适配RTL布局:如果你的App需要支持右到左的语言(比如阿拉伯语),可以使用
directionalLayoutMargins替代layoutMargins,对应的Masonry用法是v2.directionalLayoutMarginsGuide.mas_trailing,这样布局会自动适配语言方向。 - 旧版属性的注意事项:Masonry确实提供了
mas_marginRight这类属性,但它对应的是旧的NSLayoutAttributeMarginRight,这种方式是将margin作为视图自身的属性来约束,和基于layoutMarginsGuide的布局逻辑不同,现在更推荐使用layoutMarginsGuide的方式,灵活性更高。
内容的提问来源于stack exchange,提问作者jiexishede
相关产品推荐
相关产品推荐

