Masonry练习详解

Masonry自动布局详解三:remake约束 Masonry自动布局详解三:remake约束 说到iOS自动布局,有很多的解决办法。有的人使用xib/storyboard自动布局,也有人使用frame来适配。对于前者,笔者并不喜欢,也不支持。对于后者,更是麻烦,到处计算高度、宽度等,千万大量代码的冗余,对维护和开发的效率都很低。笔者在这里介绍纯代码自动布局的第三方库:Masonry。这个库使用率相当高,在全世界都有大量的开发者在使用,其star 阅读详情


添加约束的方式:
1.通过使用NSLayoutConstraints添加约束到约束数组中,之前必须设置translatesAutoresizingMaskIntoConstraints = NO,即取消自动布局;

2.通过使用MASConstraintMaker在block中添加约束,不需要再设置translatesAutoresizingMaskIntoConstraintst 属性,block内部已经帮助完成;
 
约束的关系:

equalTo  <=======>   NSLayoutRelationEqual   等于

lessThanOrEqualTo   <======>  NSLayoutRelationLessThanOrEqual   小于或等于

greaterThanOrEqualTo <=======>  NSLayoutRelationGreaterThanOrEqual  大于或等于

 

MASViewAttribute:视图约束属性

 
 
UIView/NSView
这两个约束完全相同,都是view左边大于等于label的左边位置
make.left.greaterThanOrEqualTo(label);
make.left.greaterThanOrEqualTo(label.mas_left);
 
 
NSNumber给约束设置具体的值
<1>//width >= 200 && width <= 400
make.width.greaterThanOrEqualTo(@200);
make.width.lessThanOrEqualTo(@400)
<2>//creates view.left = view.superview.left + 10
make.left.lessThanOrEqualTo(@10)

代替NSNumber,使用原始的数据或者结构体设置约束数据
make.top.mas_equalTo(42);
make.height.mas_equalTo(20);
make.size.mas_equalTo(CGSizeMake(50, 100));
make.edges.mas_equalTo(UIEdgeInsetsMake(10, 0, 10, 0));
make.left.mas_equalTo(view).mas_offset(UIEdgeInsetsMake(10, 0, 10, 0));
 
使用数组NSArray设置约束
make.height.equalTo(@[view1.mas_height, view2.mas_height]);
make.height.equalTo(@[view1, view2]);
make.left.equalTo(@[view1, @100, view3.right]);
 
 
使用优先级设置约束

.priorityHigh <======> UILayoutPriorityDefaultHigh     高优先级

.priorityMedium <========> between high and low        介于高/低之间

.priorityLow <=========> UILayoutPriorityDefaultLow   低优先级

make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow();
make.top.equalTo(label.mas_top).with.priority(600);
 
使用MASCompositeConstraints添加约束
edges:边缘
// make top, left, bottom, right equal view2
    make.edges.equalTo(view2);

// make top = superview.top + 5, left = superview.left + 10,
// bottom = superview.bottom - 15, right = superview.right - 20
    make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20))

// All edges but the top should equal those of the superview
make.left.right.and.bottom.equalTo(superview);
make.top.equalTo(otherView);
 
size:大小
// make width and height greater than or equal to titleLabel
    make.size.greaterThanOrEqualTo(titleLabel)

// make width = superview.width + 100, height = superview.height - 50
    make.size.equalTo(superview).sizeOffset(CGSizeMake(100, -50))
 
center:中心
// make centerX and centerY = button1
    make.center.equalTo(button1)

// make centerX = superview.centerX - 5, centerY = superview.centerY + 10
    make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10))
 
 
有时候,你需要修改现有的约束,以动画或删除/替换约束。在砌体中有几个不同的方法来更新约束。
1.使用设置References
// in public/private interface
@property (nonatomic, strong) MASConstraint *topConstraint;
...
// when making constraints
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    self.topConstraint = make.top.equalTo(superview.mas_top).with.offset(padding.top);
    make.left.equalTo(superview.mas_left).with.offset(padding.left);
}];
...
// then later you can call
[self.topConstraint uninstall];
 
2.更新约束 mas_updateConstraints
- (void)updateConstraints {
    [self.growingButton mas_updateConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self);
        make.width.equalTo(@(self.buttonSize.width)).priorityLow();
        make.height.equalTo(@(self.buttonSize.height)).priorityLow();
        make.width.lessThanOrEqualTo(self);
        make.height.lessThanOrEqualTo(self);
    }];

    //according to apple super should be called at end of method
    [super updateConstraints];
}
 
3.重新设置mas_remakeConstraints
- (void)changeButtonPosition {
    [self.button mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.size.equalTo(self.buttonSize);

        if (topLeft) {
            make.top.and.left.offset(10);
        } else {
            make.bottom.and.right.offset(-10);
        }
    }];
}
 具体的实例如下:设置view1举例父视图的四周距离均为50
 方式一:
复制代码
/**
方式一:使用NSLayoutConstraint实现手动布局
 
 ----------------------------
 设置UIEdgeInsets
 ----------------------------
 
 @interface UIView (UIConstraintBasedLayoutInstallingConstraints)
 - (NSArray *)constraints NS_AVAILABLE_IOS(6_0);
 - (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0);
 - (void)addConstraints:(NSArray *)constraints NS_AVAILABLE_IOS(6_0);
 - (void)removeConstraint:(NSLayoutConstraint *)constraint
 - (void)removeConstraints:(NSArray *)constraints NS_AVAILABLE_IOS(6_0);
*/
-(void)LayoutConstraint
{
    UIView *superView = self.view;
    UIView *view1 = [[UIView alloc]init];
    view1 .translatesAutoresizingMaskIntoConstraints = NO;
    view1.backgroundColor = [UIColor redColor];
    [superView addSubview:view1];
    
    //设置距离父视图边界距离
    UIEdgeInsets pading = UIEdgeInsetsMake(50, 50, 50, 50);
    
    //添加给view1约束
    [superView addConstraints:@[
                                
        [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1.0 constant:pading.top],
        
        [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:pading.left],
        
        [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-pading.bottom],
        
        [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1.0 constant:-pading.right],
    ]];
}
复制代码
 方式二:
复制代码
/**
方法二:使用block  @implementation MAS_VIEW (MASAdditions)
 
----------------------------
 设置offset偏移 或者 边缘edges
----------------------------
 
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block 
*/
-(void)LayoutForMASConstraintMaker
{
    UIView *superView = self.view;
    UIView *view1 = [[UIView alloc]init];
    view1.backgroundColor = [UIColor redColor];
    [superView addSubview:view1];
    
    //设置距离父视图边界距离
    UIEdgeInsets pading = UIEdgeInsetsMake(50, 50, 50, 50);
    
    //添加给view1约束
    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.top.equalTo(superView.mas_top).with.offset(pading.top);
        make.left.equalTo(superView.mas_left).with.offset(pading.left);
        make.bottom.equalTo(superView.mas_bottom).with.offset(-pading.bottom);
        make.right.equalTo(superView.mas_right).with.offset(-pading.right);
        
        //设置代码可以更简单(效果与上面的是一样的)
        //make.edges.equalTo(superView).with.insets(pading);
    }];
}
复制代码
 方式三:
复制代码
/**
方式三:使用block  @implementation MAS_VIEW (MASAdditions)
 
 ----------------------------
 设置margin距离
 ----------------------------
 
 
 - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block
 - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block
 - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block
*/
-(void)LayoutForMASConstraintMakerWithMargin
{
    UIView *superView = self.view;
    UIView *view1 = [[UIView alloc]init];
    view1.backgroundColor = [UIColor redColor];
    [superView addSubview:view1];
    
    //添加给view1约束
    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.topMargin.equalTo(superView.mas_top).with.offset(50);
        make.leftMargin.equalTo(superView.mas_left).with.offset(50);
        make.bottomMargin.equalTo(superView.mas_bottom).with.offset(-50);
        make.rightMargin.equalTo(superView.mas_right).with.offset(-50);
    }];
}
复制代码
 方式四:
复制代码
/**
 方式四:使用block  @implementation MAS_VIEW (MASAdditions)
 
 
 ----------------------------
 设置center和size
 ----------------------------

 
 - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block
 - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block
 - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block
 */
-(void)LayoutForMASConstraintMakerWithCenterWidthHeight
{
    UIView *superView = self.view;
    UIView *view1 = [[UIView alloc]init];
    view1.backgroundColor = [UIColor redColor];
    [superView addSubview:view1];
    
    //添加给view1约束
    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.centerX.equalTo(superView);
        make.centerY.equalTo(superView);
        make.size.equalTo(superView).sizeOffset(CGSizeMake(-100,-100));
    }];
}
Masonry自动布局详解一:基本用法 Masonry自动布局详解一:基本用法 说到iOS自动布局,有很多的解决办法。有的人使用xib/storyboard自动布局,也有人使用frame来适配。对于前者,笔者并不喜欢,也不支持。对于后者,更是麻烦,到处计算高度、宽度等,千万大量代码的冗余,对维护和开发的效率都很低。笔者在这里介绍纯代码自动布局的第三方库:Masonry。这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是 阅读详情

相关推荐

S.BUS协议及编解码,C语言源码

1、简介 SBUS本质是一种串口通信协议,采用100K的波特率,8位数据位,两位停止位,偶效验,即8E2的串口通信。 值得注意的有三点: 1.SBUS采用负逻辑,所以无论接收还是发送都要进行硬件取反(注意,一定要硬件取反),电路如下 这是我在网上看资料时看到的电路,实际上我用的是下面这个电路 2.SBUS有两种模式, a.高速模式:每4ms发送一次 b...

qq_31232793的博客 1万+

iOS Masonry使用笔记

第一步:设置的,并给自定义的添加宽度约束,这里必须要约束宽度。/// 必须先设置tableHeaderView = headerview}];第二步:更新frame并重新设置if (!第二步是很重要的一步,里面的方法只能在,否则会引起这个报错是由于遮挡住了cell,执行reloadData引起的。这种情况下被遮挡的cel其实是不可见的,不能reloadData。

king6188的博客 2063

flowable表中文注释-表结构-主要表结构字段注释-sql脚本

flowable表结构中文注释,主要表结构字段注释,sql执行脚本,包含MySQL版和Oracle版sql脚本。

bushinakeshu的博客 1069

【我就看看不说话】自动布局

转载  http://code.cocoachina.com/detail/301146/自动布局,Masonry介绍与使用实践:快速上手Autolayout/ 我们先来看一段官方的sample code来认识一下Masonry [view1 mas_makeConstraints:^(MASConstraintMaker *make) {     make.edges.eq

DaJu的专栏 618

机器视觉:9点标定的原理与实现

标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素,如下图所示,10mm的距离内有222个像素,那像素坐标和实际的毫米坐标就有个比例关系了。

m0_49968063的博客 1万+

candence layout快捷键

摁住鼠标左键再框选:选中 摁住鼠标右键再框选:放大 选中之后,滚动鼠标滚轮进行放大缩小。 F:回到全局 shift+V:缩小 键盘的箭头:移动视图 F1:显示帮助文档Candence help F2:保存 点击r,画出矩形时不双击鼠标,点击F3,可以设置尺寸。 Creat-Shape-Path Creat-Wiring-Bus:画多根线。F3设置线宽、间距等。 选中金属后,Shift+G画保护环guard ring。F3可以设置距离金属的间距、保护环的形状。 Path和Rectang

weixin_45861827的博客 2655

iOS:Masonry约束经验(19-03-21更)

1、label约束:   1)、只需约束x、y 点相关就行。宽高 长度相关不用约束,就算用boundingRectWithSize计算出来的,也可能不准。     如:top、bottom二选一,trailing、leading二选一,或者center,宽高会自动生成。(同时约束trailing、leading的话,相当于设了宽度)   2)、有些地方怕label过长超出,或覆盖其...

weixin_30877493的博客 592

影楼精修-AI追色算法解析

本文解析了像素蛋糕软件中AI追色功能的技术原理与实现方案,为理解AI追色技术提供了实用参考。

Trent1985的专栏 2万+

IOS 第三方库之-Masonry 基本用法

Masonry 基本用法 1,源码示例 1)创建一个view对象,使用约束居中显示,后面测试都使用这个view对象 UIView *view = [[UIViewalloc] init];     view.backgroundColor = [UIColorblackColor];     [self.viewaddSubview:view]; //使用autola

hell03W 2597

杰理AC695N芯片跑iic接口的oled驱动分享

本文介绍了一个基于IIC接口的0.96寸OLED显示屏驱动程序,适用于SSD1306控制器。驱动采用软件模拟IIC方式,支持字符、数字、字符串、汉字和图片显示,测试平台为杰理AC695N系列芯片。硬件参数包括128×64分辨率,IIC接口(地址0x78),使用IO_PORTA_02(SDA)和IO_PORTA_03(SCL)引脚。驱动包含OLED主文件(oled.c/h)、软件IIC实现(soft_iic.c/h)和字体/图片数据文件(oledfont.h/bmp.h),可通过修改soft_iic.h中的引

qq_42014563的博客 882

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针

专注于编程、AI、人工智能等多个领域内容研究和分析 1080

ios布局 分为左右两块_iOS 的布局

iOS布局可以xib文件布局,也可以代码布局,代码布局一般使用第三方框架masonry可以用pods导入masonry,在需要使用的文件里导入头文件#import 1.masonry使用masonry使用时,必须是在控件被addSubView之后在才能使用masonry布局约束,不然程序会崩equalTo 等于mas_equalTo 等于 参数:一般传入确定值offset 偏移值gre...

weixin_29722783的博客 656

高通平台 Android T 蓝牙技术全解析:架构、代码与实现原理

协议栈、配置文件和服务都运行在一个独立的用户空间进程。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 100

iOS:Masonry练习详解

Masonry练习详解 添加约束的方式: 1.通过使用NSLayoutConstraints添加约束到约束数组中,之前必须设置translatesAutoresizingMaskIntoConstraints = NO,即取消自动布局; 2.通过使用MASConstraintMaker在block中添加约束,不需要再设置translatesAutoresizingM...

dienangpiao2051的博客 437

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【iOS】Masonry学习

Masonry是一个轻量级的布局框架。通过链式调用的方式来描述布局,是排版代码更加简洁易读。masonry支持iOS和Mac OS X。相比原生的NSLayoutConstraint,提高了使用容易度和代码的可阅读程度。

2301_79847748的博客 1635

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

揭秘vue-masonry工作原理:从directive到Masonry实例的实现细节

vue-masonry是一个专为Vue.js设计的瀑布流布局插件,它通过自定义指令的方式将Masonry布局功能无缝集成到Vue应用中。本文将深入解析其内部实现机制,帮助开发者理解从指令定义到Masonry实例创建的完整流程。 ## 核心架构概览 vue-masonry的核心实现集中在[src/masonry.plugin.js](https://link.gitcode.com/i/9aed

gitblog_00067的博客 831

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Masonry详解

前言 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不

杨永福 1321

Masonry练习总结

Masonry练习总结

weixin_43900761的博客 325

Masonry核心API与使用方法详解

Masonry核心API与使用方法详解 本文全面解析Masonry瀑布流布局库的三种初始化方式(jQuery、Vanilla JS、HTML属性)、核心配置选项、布局算法原理与性能优化策略,以及响应式设计与移动端适配的最佳实践。通过详细的代码示例、配置分析和性能优化技巧,帮助开发者深入理解Masonry的工作原理并掌握其高级用法。 三种初始化方式:jQuery、Vanilla JS、HTML属性 ...

gitblog_00652的博客 716

Masonry的入门学习

在日常的开发中,我们如果面对一些很复杂的UI布局,我们如果统一使用frame的方式来设置的话,会相当复杂,这时候就孕育而生了自动布局,但是在我们原生的环境下,苹果原生的自动布局语言比较复杂,而我们现在要学习的一个Masonry这个第三方库会给我们提供了更加简洁的语法。

qq_73106050的博客 1459

Masonry源码

这篇文章是 Masonry 框架源码的解析和笔记。学习Masonry之前,先了解这个框架设计的初衷—传统的利用系统API进行纯代码布局的不足。然后,根据Masonry常见的几个链式语法中,顺藤摸瓜地了解Masonry的调用栈。最后,学习并思考这个框架用到的设计模式和链式编程思想。

weixin_61196797的博客 1301
上一篇: NSLayoutAttribute
下一篇: key window蒙层
SpringJustin
博客等级 码龄11年 2粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值