You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:10