横向排列views,自动换行

移动端完美适配优化总结 Viewport优化:正确的视口设置设备检测优化:更精确的设备类型判断断点优化:细致的断点划分布局优化:移动端和平板端独立优化全局样式优化:全面的兼容性处理小屏手机优化:特殊的小屏设备处理平板端优化:充分利用平板屏幕空间。 阅读详情

有时候碰见两行一样的按钮, 不想用collectionView,一个个写是更不可能的了,所以for循环创建完之后用这个方法排列一下搞定

/**
 排列view,横向间隔自动计算

 @param views 要排列的views
 @param width 总宽度
 @param column 列数(每行几个)
 @param origin 起始点(第一个view起始点)
 @param verDistance views纵向间隔(行间距)
 */
- (void)arrangeViews:(NSArray *)views
      superviewWidth:(float)width
              column:(int)column
              origin:(CGPoint)origin
    verticalDistance:(float)verDistance
{
    for (int i = 0; i < views.count; i++) {
        UIView *view = views[i];
        //起始x 两个x的差 列:i%column
        view.x = origin.x + i%column * (width-2*origin.x-view.width)/(column-1);
        //起始y 两个y的差 行:i/column
        view.y = origin.y + i/column * (view.height+verDistance);
    }
}
/**
 排列view,固定间隔,自动计算列数

 @param views 要排列的views
 @param width 总宽度
 @param origin 起始点(第一个view起始点)
 @param distance 间距
 */
- (void)arrangeViews:(NSArray *)views
      superviewWidth:(float)width
              origin:(CGPoint)origin
            distance:(float)distance
{
    for (int i = 0; i < views.count; i++) {
        UIView *view = views[i];
        //一共多少列
        int column = (width - origin.x*2)/(view.width + distance);
        //起始x+当前列数*(间隔+view.width) 当前列:i%列数
        view.x = origin.x + i%column * (distance+view.width);
        //起始y+当前行数*(间隔+view.height) 当前行:i/列数
        view.y = origin.y + i/column * (distance+view.height);
    }
}


为了方便偷懒把创建button的代码也放上:

- (void)createBtns {
    NSArray *titleArr = @[@"快捷回复", @"结束对话", @"下达医嘱", @"收起", @"坐诊信息", @"添加图片"];
    NSArray *imgArr = @[@"qd_kjhf_n", @"qd_jsdh", @"qd_xdyz", @"qd_zk_n", @"qd_zzxx_n", @"qd_tjtp"];
    NSMutableArray *btnArr = [NSMutableArray array];
    for (int i = 0; i < titleArr.count; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        btn.size = CGSizeMake(44, 46);
        [btn setTitle:titleArr[i] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:imgArr[i]] forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        //MARK: 上下排列图文
        btn.titleLabel.font = [UIFont systemFontOfSize:10];
        btn.titleEdgeInsets = UIEdgeInsetsMake(btn.imageView.height, -btn.imageView.width, 0, 0);
        btn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, btn.height - btn.imageView.height, -btn.titleLabel.width);
        [_btnsContainer addSubview:btn];
        
        btn.tag = i+200;
        [btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
        
        [btnArr addObject:btn];
    }
    [self arrangeViews:btnArr superviewWidth:kScreenWidth column:4 origin:CGPointMake(22, 8) verticalDistance:6];
}
哦对了,用了Category所以是view.x view.width这种写法

H2O到OmniH2O细节解读,人形机器人遥操作的技术演进与哲学 摘要:CMU何泰然团队相继发表的H2O和OmniH2O论文为人形机器人遥操作领域带来突破。H2O首创Sim-to-Data方法,通过形态/动作重定向和特权筛选处理人类动作数据,PPO算法实现基础控制。OmniH2O改进为教师-学生蒸馏框架,采用DAgger算法增强泛化能力,并消除对线速度输入的依赖。这两项工作从概念验证到工程落地,建立了一套完整的动作学习范式,为具身智能研究提供了重要参考。 阅读详情

相关推荐

C#创建COM组件,QT调用COM组件简单测试(VS2008+QT4.6.4)

一. C#创建组件: 1. VS2008新建一个项目,选择Visual C#, Class library 修改Properties下面的AssemblyInfo.cs文件,ComVisible属性设置为True,即:[assembly: ComVisible(true)] 2. 右击项目,选择“属性”, 选择“生成”选项卡,把“为COM互操作注册”勾选上 选择“签名”选项卡,把“

3517

多个view横向排列的便捷方法

多个view横向排列的便捷方法 在写自适应div( web端 )或view(微信端)的布局时,可以用以下俩种方法进行便捷布局 : 利用外层div或外层view的display : flex ; flex-flow : row; 利用外层div或外层view的white-space:nowrap;属性 white-space属性值 normal 默认。空白会被浏览器忽略。 pre 空白会被浏览器保留。其行为方式类似 wxml中的标签。 nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签为止。

MarryLinDa的博客 2314

LCL滤波器参数设计实战:从理论约束到工程选型指南

本文提供了LCL滤波器参数设计的实战指南,从理论约束到工程选型逐步拆解。核心在于平衡总电感量、电感比与电容值,确保谐振频率落在安全区间,以满足并网电流谐波标准并维持系统稳定。文章以10kW并网逆变器为例,给出了具体的参数计算流程与选型步骤,并强调了寄生参数、阻尼设计等工程实现细节。

c6d7e8f9g的博客 921

自定义组合View(横向/纵向/斜向)

先写一个类 让他继承与ViewGroup 别的先不写 接着在Value文件下 创建attrs.xml 接着写布局文件 接着写那个类

qq_43677688的博客 851

保姆级避坑指南:在Ubuntu 22.04上成功复现VMamba模型(附完整环境依赖清单)

本文提供了在Ubuntu 22.04上复现VMamba模型的详细指南,包括环境准备、CUDA与PyTorch的精确匹配、依赖安装的疑难杂症解决以及完整环境清单。特别针对Linux系统下的环境复现问题,提供了实用的避坑技巧和验证方法,帮助开发者高效完成VMamba模型的部署。

weixin_29083373的博客 263

深入Linux内核:PTP硬件时间戳(HW Timestamp)是如何炼成的?

本文深入探讨了Linux内核中PTP硬件时间戳(HW Timestamp)的实现原理与实战应用。通过分析IEEE 1588协议在网络时间同步中的关键作用,详细解析了硬件时间戳在Linux内核中的架构设计、驱动开发及性能优化技巧,帮助开发者实现纳秒级精度的时间同步。

weixin_30727835的博客 651

Android recycleview使用详解,recycleview实现九宫格布局即横向排列,recycleview设置item占位数量大号item或小号item

1、添加recycleview依赖 compile('com.android.support:recyclerview-v7:25.1.1') { force = true } 2、item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas...

meixi_android的博客 4877

ILI9488 TFT屏驱动与触摸协同开发指南

TFT-LCD显示模块是嵌入式人机交互系统的核心外设,其工作原理依赖于专用显示控制器(如ILI9488)对GRAM显存的精确读写,并通过SPI等串行总线接收指令与图像数据。理解RGB接口时序、寄存器初始化流程及DC/CS信号控制逻辑,是实现稳定显示的基础技术前提;而四线电阻式触摸功能则需配合XPT2046类ADC控制器,通过独立SPI或模拟时序完成坐标采集。该方案兼顾低功耗、高集成与工程可移植性,广泛应用于工业HMI、仪器仪表及STM32F407等MCU平台的教学与产品开发。本文围绕3.5英寸320×480

weixin_33814090的博客 149

RecyclerView 的简单使用 -- (横向/纵向)列表、网格、瀑布流的实现

代码实现 Activity.java public class RecyclerViewActivity extends BaseActivity { private RecyclerView recyclerView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { ...

villen_t的博客 2万+

ESP32-C5硬件设计全链路指南:ADC/SDIO/USB/RF PCB实战

模数转换器(ADC)和高速外设接口是嵌入式系统硬件设计的核心基础。理解ADC通道映射、输入阻抗特性与抗干扰布线,是保障传感器采样精度的前提;掌握SDIO、USB差分信号的阻抗控制、端接策略与电源去耦方法,则直接决定通信可靠性与EMC性能。在Wi-Fi 6/Bluetooth 5.3双模SoC如ESP32-C5中,ADC复用约束、USB与SDIO管脚冲突、RF匹配网络调校、四层板叠层规划等工程细节,共同构成高成功率PCB落地的关键技术栈。本文聚焦ESP32-C5平台,系统梳理从模拟前端到射频输出的硬件设计规范

weixin_35756130的博客 345

【ROS2】RViz2加载URDF模型文件

1)运行RViz2rviz22)添加组件:RobotModel3)选择通过文件添加4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可

郭老二 1450

vue textarea van-field手机端 输入框实现显示的内容换行或者空格处理

移动端框架vant-ui: <van-cell-group class="m30 borderRadius"> <van-field v-model="content" rows="5" autosize type="textarea" placeholder="请输入内容" /> </van-cell-group> if(this.content==""){ this.$toast("请输入内容");

总结前端开发中遇到的问题,分享前端知识 1万+

Unity小游戏接入抖音敏感词检测

摘要: 本文介绍了Unity小游戏接入抖音敏感词检测的方法。抖音官方提供了两种API:SensitiveWordCheck用于检测敏感词,ReplaceSensitiveWords用于替换敏感词。此外,若使用键盘输入事件,可通过tt.onKeyboardComplete监听回调,平台会自动屏蔽敏感词(替换为*)。接入官方字库可有效避免审核驳回,适用于小游戏中的用户输入功能(如起名系统)。附官方文档链接及参数说明。

类人_猿的博客 4594

Android 自定义自动换行控件

声明:本文在http://blog.sina.com.cn/s/blog_73e890f40101docf.html基础上修改而成    android:id="@+id/tag"     android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation=

faithmy509的专栏 3658

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

踩坑记20 element-plus 默认语言设置 | el-pagination 分页器自动换行 | vue-router Maximum call stack size exceeded

2021.9.6 坑64(element-plus、语言配置):element-plus默认语言是英文。而目标是配置语言为中文。参考文档组件 | Element (element-plus.org)国际化,可以很快配置完成,代码如下: // main.js import ElementPlus from 'element-plus' import zhCn from 'element-plus/es/locale/lang/zh-cn' app.use(ElementPlus, { loca..

Alloom的博客 2381

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HarmonyOS 6|Flex 弹性换行布局 FlexWrap.Wrap,实现标签多选流式排布自动换行自适应宽度解决方案

在React Native中开发鸿组件(这里指的是鸿蒙(HarmonyOS)组件),你需要了解鸿蒙开发的基础以及如何在React Native项目中集成鸿蒙应用。鸿蒙OS是由华为开发的一个分布式操作系统,主要用于其智能设备,如手机、平板、智能手表等。首先,你需要熟悉鸿蒙OS的开发环境设置和基本开发流程。React Native本身主要用于Harmony和Harmony平台的开发,但你可以通过以下几种方式将鸿蒙应用集成到React Native项目中:A. 使用WebView。

2401_89578244的博客 644

visio安装包

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

深入解析 Material Components Android 的 BottomNavigationView:Material 3 导航栏的完整实现与定制指南

Material Components for Android(以下简称 MDC-Android)中的 `BottomNavigationView` 是 Material 3(M3)"Navigation bar(导航栏)"组件的官方实现,用于让用户在小屏设备上通过一次点击在多个顶级视图之间快速切换。本文以 [docs/components/BottomNavigation.md](https:/

gitblog_01271的博客 884

IOS9 UIStackView(转)

在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方式,纵向或横向的叠放你的 views。UIStackView 采用 auto layout 的方式来管理他的子视图的位置和尺寸。让你更简单的构建自适应的 UI。 如果在 iOS9 之前,你想要创建类似 UIStackView 为你提供的这种布局,你需要构建大量的 constraints。你需

滴水可以穿石 百炼才能成钢,谋全局而通一域 致广大而尽精微 530

Anroid 布局管理器

目录(?)[+] 写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器都有一个LayoutParams内部类, android:... 是父容器用来控制子组件的属性. 如android:layout_gravity 是控制组

精彩人生从此刻开始 608

layout-card与原生布局对比:谁才是Home Assistant界面之王?

在智能家居管理中,Home Assistant的界面布局直接影响用户体验。layout-card作为一款强大的自定义布局工具,为用户提供了比原生布局更多的控制选项。本文将深入对比layout-card与原生布局的优缺点,帮助你找到打造完美智能家居控制面板的最佳方案。 ## 核心功能解析:layout-card如何重塑Home Assistant界面 layout-card是一个专为Home A

gitblog_00946的博客 428

css display:flex 属性

原文链接:https://www.jianshu.com/p/d9373a86b748 一:display:flex 布局 display:flex 是一种布局方式。它即可以应用于容器中,也可...

a2543035112的博客 176

vue-admin-template移动端适配方案:响应式设计与弹性布局

你还在为后台系统无法在手机上正常操作而烦恼吗?运营人员在外急需查看数据却因界面错乱无法操作?本文将通过响应式设计与弹性布局改造,让vue-admin-template完美适配手机、平板等移动设备,实现随时随地高效办公。 读完本文你将获得: - 3步完成基础适配配置 - 响应式侧边栏实现方案 - 触控友好的界面优化技巧 - 表单与表格的移动端适配代码 ## 适配现状分析 vue-admin-t...

gitblog_01113的博客 365

Eclipse SWT相关API介绍

继承Layout,实现computeSize和layout方法,computeSize容器用来计算自己的偏好尺寸。layout方法是调用shell.layout时,容器类调用的方法,这个方法真正负责排布控件的任务。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 944

biliTickerBuy 5 分钟上手:从倒计时到抢到票的完整路径

biliTickerBuy 是一个开源的 B站会员购抢票辅助工具,抢票脚本的核心只有一句话:用纯接口发下单请求,而不是靠你点页面。想象这个画面:倒计时归零,你手指刚落到「立即购买」上,页面开始转圈,等你再刷新一次,只剩"已售罄"。人的反应以秒计,脚本的抢票循环却提前就位:开抢前一秒它已经预热好连接、备好下单参数,倒计时一到就按固定间隔发出创建订单请求,全程不用人盯,结果直接推送到你手机。 ##

gitblog_00145的博客 1026

RuoYi-Vue移动端适配:响应式布局设计

你是否遇到过管理系统在手机上界面错乱、操作困难的问题?本文将详细介绍如何基于RuoYi-Vue框架实现移动端响应式布局,通过灵活的CSS策略和组件适配,让后台系统在各种设备上都能提供出色的用户体验。读完本文后,你将掌握响应式布局的核心实现方法,能够快速将现有管理系统改造为支持移动端访问的版本。 ## 响应式基础架构 RuoYi-Vue的响应式布局基础建立在SCSS变量和混合宏系统之上。项目的样...

gitblog_00808的博客 1280

Figma设计系统到Vue代码的三阶转化实战

设计系统是现代前端工程的核心基础设施,其本质是将视觉规范(如颜色、间距、字体)转化为可编程、可复用、可维护的代码资产。理解CSS自定义属性原理与设计令牌(Design Tokens)的映射机制,是打通UI设计与前端开发的关键技术路径;结合Vue的响应式能力、scoped样式隔离和语义化模板,能天然支撑从Figma Variables到语义化HTML结构的精准落地。该方法不仅提升开发效率300%,更保障了可访问性、SEO友好性与多端一致性,广泛适用于中后台系统、SaaS平台及电商类项目。

377
上一篇: 原生UIButton的文本与图片的布局
下一篇: 隐藏系统返回按钮,保留系统滑动返回
csdndimo
博客等级 码龄13年 0粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值