深入理解IOS控件布局之Masonry布局框架

深入理解iOS控件布局之Masonry布局框架

什么是Masonry

Masonry是iOS开发中一款优秀的自动布局框架,简化了AutoLayout布局时繁琐的约束设置过程,提高了开发效率。Masonry使用链式语法让代码易于编写和理解,支持纯代码和XIB/storyboard两种方式进行布局设置。

安装Masonry

使用CocoaPods安装Masonry:

pod 'Masonry'

Masonry基本语法

建立约束

Masonry建立约束的语法格式如下:

make.size.mas_equalTo(CGSizeMake(50, 50));

这句代码的意思是,建立一个宽度和高度都为50的大小约束。

设置约束优先级

可以通过设置mas_前缀的属性来提高或降低约束的优先级:

make.width.mas_equalTo(50).priorityLow();

这句代码的意思是,建立一个宽度为50的大小约束,但是优先级是低优先级。

水平方向和垂直方向的约束

  • 水平方向:左、右、中心点、宽度
make.left.mas_equalTo(10);
make.right.mas_equalTo(-10);
make.centerX.mas_equalTo(self.view.mas_centerX);
make.width.mas_equalTo(50);

这句代码的意思是,建立左边距为10、右边距为-10、水平中心点居中、宽度为50的约束。

  • 垂直方向:上、下、中心点、高度
make.top.mas_equalTo(10);
make.bottom.mas_equalTo(-10);
make.centerY.mas_equalTo(self.view.mas_centerY);
make.height.mas_equalTo(50);

这句代码的意思是,建立上边距为10、下边距为-10、垂直中心点居中、高度为50的约束。

修改约束

可以修改已经建立的约束:

[view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.width.mas_equalTo(100);
    make.height.mas_equalTo(100);
}];

这句代码的意思是,修改宽度为100、高度为100的约束。

删除约束

可以删除已经建立的约束:

[view mas_remakeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];

这句代码的意思是,删除所有已经添加的约束,并重新添加四边距离为10的约束。

Masonry实例

Masonry的实例演示一般会涉及到其他UI组件的使用。下面是两个Masonry实例与其他UI组件的搭配。

实例1:创建一个登录页面

// 设置背景
UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background"]];
[backgroundImageView setContentMode:UIViewContentModeScaleAspectFill];
[self.view addSubview:backgroundImageView];

// 添加用户名输入框
UITextField *usernameTextField = [[UITextField alloc] init];
[usernameTextField setBorderStyle:UITextBorderStyleRoundedRect];
[usernameTextField setPlaceholder:@"请输入用户名"];
[self.view addSubview:usernameTextField];

// 添加密码输入框
UITextField *passwordTextField = [[UITextField alloc] init];
[passwordTextField setBorderStyle:UITextBorderStyleRoundedRect];
[passwordTextField setPlaceholder:@"请输入密码"];
[passwordTextField setSecureTextEntry:YES];
[self.view addSubview:passwordTextField];

// 添加登录按钮
UIButton *loginButton = [[UIButton alloc] init];
[loginButton setTitle:@"登录" forState:UIControlStateNormal];
[loginButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[loginButton.layer setBorderColor:[UIColor blueColor].CGColor];
[loginButton.layer setBorderWidth:1.0];
[loginButton.layer setCornerRadius:5.0];
[self.view addSubview:loginButton];

[backgroundImageView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(self.view);
}];

[usernameTextField mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(150);
    make.left.mas_equalTo(20);
    make.right.mas_equalTo(-20);
    make.height.mas_equalTo(40);
}];

[passwordTextField mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(usernameTextField.mas_bottom).offset(20);
    make.left.mas_equalTo(20);
    make.right.mas_equalTo(-20);
    make.height.mas_equalTo(40);
}];

[loginButton mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(passwordTextField.mas_bottom).offset(20);
    make.centerX.mas_equalTo(self.view.mas_centerX);
    make.width.mas_equalTo(200);
    make.height.mas_equalTo(40);
}];

这段代码的具体实现是,创建一个包含输入用户名、密码和登录按钮的登录页面,其中背景使用图片填充,用户名和密码使用UITextField组件,登录按钮使用UIButton组件。

实例2:创建一个简单的表单

// 添加姓名标签
UILabel *nameLabel = [[UILabel alloc] init];
[nameLabel setText:@"姓名:"];
[self.view addSubview:nameLabel];

// 添加姓名输入框
UITextField *nameTextField = [[UITextField alloc] init];
[nameTextField setBorderStyle:UITextBorderStyleRoundedRect];
[self.view addSubview:nameTextField];

// 添加性别标签
UILabel *genderLabel = [[UILabel alloc] init];
[genderLabel setText:@"性别:"];
[self.view addSubview:genderLabel];

// 添加性别选择器
UISegmentedControl *genderSegmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"男",@"女"]];
[genderSegmentedControl setSelectedSegmentIndex:0];
[self.view addSubview:genderSegmentedControl];

[nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(100);
    make.left.mas_equalTo(20);
    make.width.mas_equalTo(60);
}];

[nameTextField mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(100);
    make.left.mas_equalTo(nameLabel.mas_right).offset(10);
    make.right.mas_equalTo(-20);
    make.height.mas_equalTo(nameLabel.mas_height);
}];

[genderLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(nameLabel.mas_bottom).offset(20);
    make.left.mas_equalTo(20);
    make.width.mas_equalTo(60);
}];

[genderSegmentedControl mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(nameTextField.mas_bottom).offset(20);
    make.left.mas_equalTo(20);
    make.right.mas_equalTo(-20);
    make.height.mas_equalTo(30);
}];

这段代码的具体实现是,创建一个包含姓名和性别两个表单项的表单,其中姓名和性别分别使用UILabelUITextField组件展示,性别使用UISegmentedControl组件实现单选形式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解IOS控件布局之Masonry布局框架 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • centos7tar.gzzip解压命令

    CentOS7 tar.gz/zip解压命令 在Linux操作系统中,有时需要解压tar.gz或zip格式的压缩包,本文将介绍在CentOS7操作系统中,如何使用命令行解压tar.gz/zip格式的压缩包。 1. 解压tar.gz格式的压缩包 1.1. 命令格式 tar.gz格式的压缩包可以使用以下命令进行解压缩: tar -zxvf <压缩包名称&g…

    其他 2023年3月29日
    00
  • 浅谈HBuilderX开发小程序的一些问题

    关于“浅谈HBuilderX开发小程序的一些问题”的攻略,我将从以下几个方面进行讲解: 搭建HBuilderX开发环境 首先,你需要下载并安装最新版本的HBuilderX,官网下载地址为:https://www.dcloud.io/hbuilderx.html。安装完成后,打开软件,我们就可以开始开发小程序了。 创建小程序项目 在HBuilderX中,创建一…

    other 2023年6月26日
    00
  • tp5入门

    以下是tp5入门的完整攻略,包括环境搭建、路由配置、控制器和模型的使用、视图渲染和两个示例说明。 环境搭建 以下是tp5入门前需要搭建的环境: 安装PHP:从PHP官网下载PHP安装包,安装PHP。 安装Composer:从Composer官网下载Composer安装包,安装Composer。 安装tp5:使用Composer安装tp5框架。 路由配置 以下…

    other 2023年5月6日
    00
  • Intel奔腾处理器最强对手 AMD速龙200GE性能测试评测

    以下是对Intel奔腾处理器和AMD速龙200GE的性能测试评测的详细攻略: 硬件准备 准备一台支持Intel奔腾处理器的计算机和一台支持AMD速龙200GE处理器的计算机。 确保两台计算机的其他硬件配置相似,例如内存容量、硬盘类型等。 软件准备 安装操作系统:在两台计算机上安装相同版本的操作系统,例如Windows 10或Linux发行版。 安装性能测试工…

    other 2023年10月17日
    00
  • 浅析Java ClassName.this中类名.this关键字的理解

    浅析Java ClassName.this中类名.this关键字的理解 在Java中,当类中有内部类的时候,在内部类中可能会出现与外部类同名的成员变量或方法,此时就需要使用类名.this关键字来引用外部类的成员。 定义 ClassName.this可以指向外部类的实例。在内部类中使用ClassName.this引用的是外部类的实例对象。 示例1 在下面的示例…

    other 2023年6月27日
    00
  • Swift Access Control访问控制与断言详细介绍

    Swift Access Control访问控制与断言详细介绍 Swift是一门类型安全(type-safe)和面向对象(object-oriented)的编程语言,在Swift中,通过访问控制(access control)实现了对程序中各个部分的访问权限的控制,同时还提供了断言(assertion)功能,用于在程序运行时对代码逻辑的正确性进行检测,这些都…

    other 2023年6月26日
    00
  • 服务器硬件知识普及篇(需要配置服务器的朋友可以参考)

    服务器硬件知识普及篇 1. 服务器的硬件构成 一台服务器主要由以下部件构成: CPU:中央处理器,负责计算和控制指令的执行; 内存:用于存放正在运行的程序及其数据,通常越多越好; 硬盘:存储数据的设备,有机械硬盘和固态硬盘之分; 网卡:负责与外部网络通信的设备; 电源:用于供电的设备; 散热系统:降低各部件温度的设备,通常包括风扇、散热片等。 2. 如何选择…

    other 2023年6月27日
    00
  • init output stream初始化输出流源码分析

    init output stream是一个Java API中的方法,其作用是初始化输出流。下面我们来详细分析一下该方法的源码和使用方法。 方法签名 public static JdbcOutputConnection initOutputConnection( String driverClass, String url, String user, Stri…

    other 2023年6月20日
    00
合作推广
合作推广
分享本页
返回顶部