【OC】巧用UIStackView简化布局

UIStackView的运用

文章目录

  • UIStackView的运用
    • 引入
    • UIStackView的作用
    • UIStackView的属性
      • compression resistance 和 hugging
      • axis
      • alignment
      • Distribution
      • spacing
    • UIStackView的方法
    • UIStackView的示例

引入

在仿写ZARA的过程之中,我看到软件之中是有大量的按钮排列在一起的,如果自己一个一个手动将按钮给添加到主视图之中,布局就会感觉十分麻烦,为了方便操作,于是我便学习了UIStackView的相关用法来简化布局的繁琐。

UIStackView的作用

UIStackView又可以被称作堆栈视图,是一种存储视图的容器,用于简化和管理其子视图的布局和排列。

它提供了一个高效的接口用于平铺一行或一列的视图组合。对于嵌入到 StackView 的视图,我们不用再添加自动布局的约束了。UIStackView会管理这些子视图的布局,并帮我们自动布局约束。也就是说,这些子视图能够适应不同的屏幕尺寸。也就是说我们只需要去管理UIStackView本身的布局,而其中的子视图的布局可以由调控UIStackView之中的属性来进行操作。

UIStackView能对布局的代码进行化简,减少了手动添加和管理约束的工作量。而且作为一个容器,删除或者添加某一个视图时,十分便利,可以使用相关方法进行动态的操作,而且布局还会相应的进行自动布局。

另外,UIStackView 支持嵌套,我们可以将一个 Stack View 嵌套到另一个 Stack View 中,从而实现更为复杂的用户界面。(但我还未使用过)

与其他继承于``UIView`的视图不同,UIStackView 它本身不能自我渲染,比如他的 backgroundColor 是无效的,所以它注定要和 UIView 相辅相成的进行工作。它能够帮助 UIView 来处理 子View 的位置和大小等布局问题。

UIStackView的属性

compression resistance 和 hugging

compression resistance(抗压缩性)和 hugging(抗拉伸性)是 UIStackView 中的两个属性,用于控制子视图在布局过程中的压缩和拉伸行为。通常情况下,较高的值表示子视图更不容易被压缩(compression resistance)或拉伸(hugging)。

我们一般使用[view setContentHuggingPriority:(UILayoutPriority) forAxis:(UILayoutConstraintAxis)]来对其进行设置

UILayoutPriority为float类型的浮点数,具体枚举类型如下:

typedef float UILayoutPriority NS_TYPED_EXTENSIBLE_ENUM;
static const UILayoutPriority UILayoutPriorityRequired API_AVAILABLE(ios(6.0)) = 1000; // A required constraint.  Do not exceed this.
static const UILayoutPriority UILayoutPriorityDefaultHigh API_AVAILABLE(ios(6.0)) = 750; // This is the priority level with which a button resists compressing its content.
static const UILayoutPriority UILayoutPriorityDragThatCanResizeScene API_AVAILABLE(macCatalyst(13.0)) = 510; // This is the appropriate priority level for a drag that may end up resizing the window's scene.
static const UILayoutPriority UILayoutPrioritySceneSizeStayPut API_AVAILABLE(macCatalyst(13.0)) = 500; // This is the priority level at which the window's scene prefers to stay the same size.  It's generally not appropriate to make a constraint at exactly this priority. You want to be higher or lower.
static const UILayoutPriority UILayoutPriorityDragThatCannotResizeScene API_AVAILABLE(macCatalyst(13.0)) = 490; // This is the priority level at which a split view divider, say, is dragged.  It won't resize the window's scene.
static const UILayoutPriority UILayoutPriorityDefaultLow API_AVAILABLE(ios(6.0)) = 250; // This is the priority level at which a button hugs its contents horizontally.
static const UILayoutPriority UILayoutPriorityFittingSizeLevel API_AVAILABLE(ios(6.0)) = 50; 

UILayoutConstraintAxis为float类型的浮点数,具体枚举类型如下:

typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
    UILayoutConstraintAxisHorizontal = 0,
    UILayoutConstraintAxisVertical = 1
};

axis

该属性规定了UIStackView的布局方向

  • Vertical: 垂直
  • Horizontal: 水平(默认值)

alignment

子视图的对齐方式

.fill: (默认) 尽可能铺满。

.leading: 当 axis 是 vertical 的时候,按 leading 方向对齐 等价于: 当 axis 是 horizontal 的时候,按 top 方向对齐。

.top: 当 axis 是 horizontal 的时候,按 top 方向对齐 等价于: 当 axis 是 vertical 的时候,按 leading 方向对齐。

.trailing: 当 axis 是 vertical 的时候,按 trailing 方向对齐 等价于: 当 axis 是 horizontal 的时候,按 bottom 方向对齐。

bottom: 当 axis 是 horizontal 的时候,按 bottom 方向对齐 等价于: 当 axis 是 vertical 的时候,按 trailing 方向对齐。

.center:居中对齐。

Distribution

定义沿堆栈视图轴排列视图的大小和位置的布局。

  • fill: (默认值) 根据compression resistance和hugging两个 priority 布局
  • fillEqually: 均匀分布
  • fillProportionally: 按比例分布
  • equalSpacing: 等间距布局,内容大小调整
  • equalCentering: 等中间线间距布局,元素间距不小于 spacing 定义的值, 如果放不下,根据compression resistance压缩。
typedef NS_ENUM(NSInteger, UIStackViewDistribution) 
    UIStackViewDistributionFill = 0
    UIStackViewDistributionFillEqually,
    UIStackViewDistributionFillProportionally,
    UIStackViewDistributionEqualSpacing,
    UIStackViewDistributionEqualCentering,
} API_AVAILABLE(ios(9.0));

spacing

spacing 属性确定子视图之间的间距。它是一个浮点数,表示子视图之间的固定间距。默认值为0。可以根据需要调整间距大小,以实现子视图之间的空白区域。

UIStackView的方法

  • init(frame: CGRect):创建一个 UIStackView
  • init(arrangedSubviews views: [UIView]):同样是创建一个 UIStackView,但我们可以将子视图传入。views 数组里的顺序即为子视图显示的顺序。
  • addArrangedSubview(view: UIView):添加一个子视图
  • removeArrangedSubview(view: UIView):删除一个子视图
  • insertArrangedSubview(view: UIView, at stackIndex: Int):在指定位置插入一个子视图

注:如果一个元素没有被 addSubview,调用 arrangedSubviews 会自动 addSubview。当一个元素被 removeFromSuperview ,则 arrangedSubviews也会同步移除当一个元素被 removeArrangedSubview, 不会触发 removeFromSuperview,它依然在视图结构中。

UIStackView的示例

在进行仿写的过程之中,我使用UIStackView来存储按钮,相关代码如下:

- (void)setupTopBar {
    self.topBarView = [[UIView alloc] initWithFrame:CGRectZero];
    self.topBarView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:self.topBarView];
    
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = @"ZARA";
    titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:60];
    titleLabel.textAlignment = NSTextAlignmentLeft;
    titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
    [self.topBarView addSubview:titleLabel];
    
    // 创建分类标签
    UIStackView *categoryStackView = [[UIStackView alloc] initWithFrame:CGRectZero];
    categoryStackView.axis = UILayoutConstraintAxisHorizontal;
    categoryStackView.alignment = UIStackViewAlignmentCenter;
    categoryStackView.distribution = UIStackViewDistributionFillEqually;
    categoryStackView.translatesAutoresizingMaskIntoConstraints = NO;
    for (int i = 0; i < self.categories.count; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
        [button setTitle:self.categories[i] forState:UIControlStateNormal];
        button.tag = i;
        [button addTarget:self action:@selector(categoryButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
        button.titleLabel.font = [UIFont systemFontOfSize:16];
        button.tintColor = [UIColor blackColor];
        [categoryStackView addArrangedSubview:button];
    }
    [self.topBarView addSubview:categoryStackView];
    
    [NSLayoutConstraint activateConstraints:@[
        [self.topBarView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor constant:-30],
        [self.topBarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
        [self.topBarView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
        [self.topBarView.heightAnchor constraintEqualToConstant:150],
        
        [titleLabel.topAnchor constraintEqualToAnchor:self.topBarView.topAnchor],
        [titleLabel.leadingAnchor constraintEqualToAnchor:self.topBarView.leadingAnchor],
        [titleLabel.trailingAnchor constraintEqualToAnchor:self.topBarView.trailingAnchor],
        [titleLabel.heightAnchor constraintEqualToConstant:100],
        
        [categoryStackView.topAnchor constraintEqualToAnchor:titleLabel.bottomAnchor],
        [categoryStackView.leadingAnchor constraintEqualToAnchor:self.topBarView.leadingAnchor],
        [categoryStackView.trailingAnchor constraintEqualToAnchor:self.topBarView.trailingAnchor]
    ]];
}

以上代码实现了,五个相关按钮的布局,按钮在点击之后会切换无限视图的图片种类为对应按钮名称。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/794345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文带你掌握SpringMVC扩展点RequestBodyAdvice和ResponseBodyAdvice如何使用及实现原理

1.概述 Spring MVC是当今web项目系统开发后端技术框架的不二之选&#xff0c;也是Spring全家桶中非常重要的一个成员&#xff0c;它的设计思想和实现套路都是很值得我们学习的&#xff0c;所以今天我们就再来看看Spring MVC框架中预留的两个钩子也就是扩展点&#xff1a;Reque…

minio在redhat7.9上面的单节点单驱动离线安装(docker)

问题 最近需要在红帽上面离线安装minio&#xff0c;并且还是要离线安装到服务器中的Docker里面去。 检查服务器磁盘 # lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs xxxxsx-xxx-xxx…

如何基于大模型开发应用接口

一、前言 针对自然语言处理方向&#xff0c;以前要开发一个情感分析、命名实体识别之列的应用是非常麻烦的&#xff0c;我们需要完成收集数据、清理数据、构建模型、训练模型、调优模型等一系列操作&#xff0c;每一步都非常耗时。如今大语言模型&#xff08;LLM&#xff09;的…

【BUG】已解决:JsonMappingException

已解决&#xff1a;JsonMappingException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 概述&#xff1a; 没有getter方法的实体的序列化&#xff0c;并解决Jackson引发的JsonMappingException异常。 默认情况下&#xff0c;Jackson 2只会处理公有字段或具有公有get…

RK3588部署YOLOV8-seg的问题

在使用YOLOV8-seg训练出来的pt模型转为onnx的时候&#xff0c;利用以下仓库地址转。 git clone https://github.com/airockchip/ultralytics_yolov8.git 在修改ultralytics/cfg/default.yaml中的task&#xff0c;mode为model为自己需要的内容后&#xff0c; 执行以下语句 cd …

2006-2021年 291个地级市资源错配指数、劳动和资本相对扭曲指数do文件和结果

资源错配指数&#xff1a;衡量生产要素配置效率的关键指标 资源错配指数&#xff08;Misallocation Index&#xff09;是一个衡量资源配置效率的指标&#xff0c;它反映了生产要素是否得到了合理配置&#xff0c;以及是否达到了生产效率的最优状态。一个较高的资源错配指数意味…

视图库对接系列(GA-T 1400)十六、视图库对接系列(本级)通知(订阅回调)

说明 之前我们实现了订阅接口,其中有一个receiveAddr参数, 这个就是对应的回调的地址。一般情况下对应的是同一个服务。 我们推荐使用http://xxx:xxx/VIID/SubscribeNotifications接口文档 SubscribeNotificationList对象对象如下: 文档中是xml,但实际上目前使用的都是jso…

传音控股Android一面凉经(2024)

传音控股Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《传音控股Android一面凉经(2024)》。 面试职位: Android应用开发工程师(移动互联业…

Python酷库之旅-第三方库Pandas(017)

目录 一、用法精讲 41、pandas.melt函数 41-1、语法 41-2、参数 41-3、功能 41-4、返回值 41-5、说明 41-5-1、宽格式数据(Wide Format) 41-5-2、长格式数据(Long Format) 41-6、用法 41-6-1、数据准备 41-6-2、代码示例 41-6-3、结果输出 42、pandas.pivot函数 …

新旧电脑数据转移方法

随着科技的发展和电脑性能的不断提升&#xff0c;许多用户在工作和生活中都需要更换新电脑。当我们购买了一台新电脑后&#xff0c;如何将旧电脑中的数据转移到新电脑上成许多用户关注的问题。本文将详细介绍几种有效的电脑数据转移方法&#xff0c;帮助大家顺利完成数据迁移。…

5G AGV 安全演示:解决新欧盟机器指令挑战

2024 年 2 月 26 日至 2 月 29 日&#xff0c;2024 世界移动通信大会&#xff08;MWC2024&#xff09;在西班牙巴塞罗那召开。 这场以「未来先行」为主题的大会&#xff0c;吸引了大量通信领域企业和观众参加&#xff0c;现场盛况空前。 HMS Labs 在与易福门&#xff08;ifm&am…

07_Shell内置命令-declare

07_Shell内置命令-declare 一、设置变量属性 - 增加属性 取消属性 1.1、设置变量为整形变量 declare -i 变量名 #!/bin/bashage"abc" #设置变量为整形变量&#xff0c;这时候age如果不是整形&#xff0c;则置为0 declare -i age echo $age#并且设置非整形值无效, 只…

不会写提示词的,快下载这个“老六”插件(附插件)

在AI绘画的世界里&#xff0c;每一个细节都至关重要&#xff0c;面对复杂的提示词——SixGod_k插件&#xff0c;只需轻点即可获得提示词&#xff0c;sd-webui中文提示词插件、老手新手炼丹必备。 一、SixGod_k提示词的功能亮点 SixGod_k提示词不仅解决了提示词编写的难题&…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目录 MybatisPlus 核心功能1. 条件构造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推荐&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定义SQL3. Service接口 1. 条件构造器 当涉及到查询或修改语句时&#xff0c;MybatisP…

8、matlab彩色图和灰度图的二值化算法汇总

1、彩色图和灰度图的二值化算法汇总原理及流程 彩色图和灰度图的二值化算法的原理都是将图像中的像素值转化为二值&#xff08;0或1&#xff09;&#xff0c;以便对图像进行简化或者特定的图像处理操作。下面分别介绍彩色图和灰度图的二值化算法的原理及流程&#xff1a; 1&a…

怎么录制网页上的视频?这篇文章告诉你

在数字化时代&#xff0c;网页视频已成为我们获取信息、学习知识和娱乐放松的重要途径。然而&#xff0c;有时我们可能想要保存或分享网页上的视频内容&#xff0c;却苦于没有合适的工具和方法。那么怎么录制网页上的视频呢&#xff1f;本文将详细介绍两种常见的网页视频录制方…

【基础算法总结】链表

链表 1.链表常用技巧和操作总结2.两数相加4.两两交换链表中的节点4.重排链表5.合并 K 个升序链表6.K 个一组翻转链表 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&…

一个开源完全免费的无损视频或音频的剪切/裁剪/分割/截取和视频合并工具

大家好&#xff0c;今天给大家分享一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具LosslessCut。 LosslessCut是一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具&#xff0c;专为实现对视频、音频、字幕以及其他相关媒体资产的超高速无损编辑而精心打造。…

LabVIEW电子水泵性能测试平台

开发了一种车用电子水泵性能测试平台&#xff0c;该平台以工控机为载体&#xff0c;利用LabVIEW开发上位机软件&#xff0c;采用PLC控制阀门和水泵等电气元件&#xff0c;通过RS485进行数据采集并传输到上位机。通过上位机与下位机的协同控制&#xff0c;实现了数据交互处理和性…

备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…