QMUI / QMUI_iOS框架学习(五)

QMUI iOS功能 作者QMUI,源码QMUI_iOS,QMUI iOS——致力于提高项目 UI 开发效率的解决方案 http://qmuiteam.com/ios 立即下载

看源码的时候,发现了一个flat的用法,来返回一个新的cgfloat数值,为了弄懂为什么要这么做,我们来看一下

/**
 *  基于指定的倍数,对传进来的 floatValue 进行像素取整。若指定倍数为0,则表示以当前设备的屏幕倍数为准。
 *
 *  例如传进来 “2.1”,在 2x 倍数下会返回 2.5(0.5pt 对应 1px),在 3x 倍数下会返回 2.333(0.333pt 对应 1px)。
 */
CG_INLINE CGFloat
flatSpecificScale(CGFloat floatValue, CGFloat scale) {
    scale = scale == 0 ? ScreenScale : scale;
    CGFloat flattedValue = ceil(floatValue * scale) / scale;
    return flattedValue;
}

如果说苹果设备是固定ppi ,那就好计算了。。截了一份官网的ppi
,除了这个之外还有watch 设备等。。。拿这个去做适配得算死

这里写图片描述

苹果系统会假设你编程都是72dpi 。然后再自动适应,。

如果是这样 72pt = 72px , 1pt = 1px

这样你还是只用关心px,反正和pt是相等的,他设备会自己算,

后来出现了高分辨率屏幕,如果还按照px来做,为在不同像素密度的屏幕里面,像素本身大小是不一样的,会导致尺寸乱了。。。

dpi高了以后就出现了 1pt = 2px ,
1pt = 3px 就是我们平常用的@2x @3x图

然后就苹果设备会自己做适配。
所以你在运行时打印的pt 对应的px数值是根据你所运行的设备决定
的

说了这么多,现在可以开始尝试理解代码了。

运行期间到底是几倍呢?苹果有个函数

[[UIScreen mainScreen] scale];
1 pt = scale *  px

如果这个px 数值越多。就是说一个点上有更多的光栅方形格子
光栅格子是啥意思 参考这篇文章
就是我之前纠结的1pt 到底等于多少px 的数值参考文章

比如说4s scale 就是2 ,会使用@2x的图片, 6+就是3,会使用@3x的图片,

 iPhone6+在实际时,downsampling/1.15(1242x2208->1080x1920)
 , 苹果为方便开发者用的是@3x的素材,然后再缩放到@2.46x上。

因为ip6+实际物理像素比屏幕像素压缩了1.15倍。但是为了开发者方便还是只要提供@3x图就好了,苹果是会自己缩放的。

回到这个公式

ceil(floatValue * scale)/ scale

这个意思是向下取整,比如一个floatValue数值为24.3,在ip6+的屏幕上
scale = 3

floatValue * scale=72.900000000000006
ceil(72.900000000000006) = 73 (这个是实际屏幕的显示的大小)
73 /scale = 24.333333333333332 (这个是代码中应该写的数值,来保证屏幕实际大小是73)

为什么要保证屏幕尺寸取最小值呢,ceil 代表向下取整,是为了最大限度处理像素吧,不要出现<1的方格, px 放在pt里面就是一个pt 对应多少个px数值,
像素说到底是一个方格,0.00001个方格怎么放,就不好说了,因为普通意义上这个方格就是最小的点了,苹果系统应该会忽略他,至于怎么忽略,我们就不知道了。所以可以自己把方格数量取整,就不会出现像素有预想的偏移量了。

最后补充一下image 要用imageNamed初始化的原因

以下基于UIImage的两类初始化API简介高倍图的适配:
同时该API根据UIScreen的scale,
自动查找包含对应高倍图后缀名(@2x)的文件,如果找到二倍图,
则image.scale=2.0,
对应逻辑size大小以point度量(pixel度量的一半);
如果没找到设置默认image.scale=1.0,
对应逻辑size大小同像素尺寸。
因此,使用该方法,无需特意指定高倍图后缀。
在实际运行时,系统如果发现当前设备是Retina屏(scale=2),
会自动寻找"*@2x.png"命名格式的图片,
加载针对Retina屏的图片素材,否则会失真。

如果是label 记得添加了文字后 要用sizetoFit

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 110, 150)];
label.backgroundColor = [UIColor orangeColor];
[self.view addSubview:label];
/*
 CGRectGetHeight返回label本身的高度
 CGRectGetMinY返回label顶部的坐标
 CGRectGetMaxY 返回label底部的坐标
 CGRectGetMinX 返回label左边缘的坐标
 CGRectGetMaxX 返回label右边缘的坐标
 CGRectGetMidX表示得到一个frame中心点的X坐标
 CGRectGetMidY表示得到一个frame中心点的Y坐标
 */

这个是框架做的横屏适配,之后我也 会按照这种写法。

        //左边视图宽度 = 滚动视图宽度 / 2, 右边视图宽度 = 滚动视图宽度- 左边视图宽度;
        CGFloat leftWidth = flat(CGRectGetWidth(self.scrollView.bounds) / 2);
        CGFloat rightWidth = CGRectGetWidth(self.scrollView.bounds) - leftWidth;

        //左边视图高度 = logo图高度 + label顶部距离 + label高度
        CGFloat leftHeight = CGRectGetHeight(self.logoImageView.frame) + versionLabelMarginTop + CGRectGetHeight(self.versionLabel.frame);
        //左边视图最小Y数值 = (滚动视图高度 - 导航栏的底部高度)- 左边视图高度 /2;来保证 左边视图全部居中
        CGFloat leftMinY = CGFloatGetCenter(CGRectGetHeight(self.scrollView.bounds) - CGRectGetMaxY(self.navigationController.navigationBar.frame), leftHeight);
        //logo图的frame =  logo图的rect  x =(左边视图宽度 -logo图宽度)/2  y = 最小y数值
        self.logoImageView.frame = CGRectSetXY(self.logoImageView.frame, CGFloatGetCenter(leftWidth, CGRectGetWidth(self.logoImageView.frame)), leftMinY);
        //版本label frame = 版本label的rect  x = 和logo图的水平居中的位置  y = logo图加上高度
        self.versionLabel.frame = CGRectSetXY(self.versionLabel.frame, CGRectGetMinXHorizontallyCenter(self.logoImageView.frame, self.versionLabel.frame), CGRectGetMaxY(self.logoImageView.frame) + versionLabelMarginTop);

        //右边内容宽度 = 右边视图宽度 - 左右两边的边距
        CGFloat contentWidthInRight = rightWidth - UIEdgeInsetsGetHorizontalValue(padding);
        //访问官网的frame  x = 左边宽度 + pading距离  y = logo图片的顶部 + 10 宽度 = 右边内容宽度 高度
        self.websiteButton.frame = CGRectMake(leftWidth + padding.left, CGRectGetMinY(self.logoImageView.frame) + 10, contentWidthInRight, buttonHeight);
        //功能列表的frame  rect 和访问官网一致   y 和访问官网底部一致
        self.documentButton.frame = CGRectSetY(self.websiteButton.frame, CGRectGetMaxY(self.websiteButton.frame));
        //同上
        self.gitHubButton.frame = CGRectSetY(self.documentButton.frame, CGRectGetMaxY(self.documentButton.frame));

        //copyRightLabel 的高度 = 自适应一下,传入宽度 右边内容宽度
        CGFloat copyrightLabelHeight = [self.copyrightLabel sizeThatFits:CGSizeMake(contentWidthInRight, CGFLOAT_MAX)].height;
        //copyRightLabel frame   x = 左边宽度 + pading距离   y = 滚动视图高度 - 导航条底部 - 底部底部边距 - 高度,
        self.copyrightLabel.frame = CGRectFlatMake(leftWidth + padding.left, CGRectGetHeight(self.scrollView.bounds) - CGRectGetMaxY(self.navigationController.navigationBar.frame) - padding.bottom - copyrightLabelHeight, contentWidthInRight, copyrightLabelHeight);
        //滚动视图内容区域 =  宽度 为 屏幕宽度     高度=屏幕高度 - 导航栏的高度
        self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds) - CGRectGetMaxY(self.navigationController.navigationBar.frame));

这里写图片描述

很好用的Xcode qmui-ios-codesnippets 很好用的Xcode qmui-ios-codesnippets直接下载 或者到https://github.com/QMUI/QMUI_iOS_CodeSnippets下载 立即下载

相关推荐

QMUI_iOS:QMUI iOS——致力于提高项目UI开发效率的解决方案

QMUI iOS QMUI iOS是一个致力于提高项目UI开发效率的解决方案,其设计目的是用于辅助快速构建一个本身基本设计还原效果的iOS项目,同时利用自身提供的丰富控件和兼容处理,让开发者能专注不管是新项目的创造,还是已有项目的维护,从而使开发效率和项目质量得到大幅度提升。 官网: : 功能特性 全局UI配置 只需要修改一份配置表就可以调整App的布局样式,包括颜色,导航栏,输入框,列表等。 UIKit扩展及版本兼容 扩展多个UIKit的组件,提供更多丰富的特性和功能,提高开发效率;解决不同的iOS版本常见的兼容性问题。 丰富的UI控件 提供丰富且常用的UI控件,使用方便灵活,并支持自定义控件的样式。 高效的工具方法及宏 提供高效的工具方法,包括设备信息,动态字体,键盘管理,状态栏管理等,可以解决各种常见场景并大幅度提高开发效率。 支持iOS版本 4.2.0及以上,iOS 10+。

推荐开源项目:QMUI_iOS —— 腾讯出品的高效iOS开发框架

QMUI_iOS 是腾讯推出的一款强大的 iOS 开发框架,旨在提升开发者们在构建用户界面时的效率和质量。 提供了丰富的 UI 组件、工具类以及设计模式,帮助开发者快速构建出美观且统一的应用界面。 ## 技术分析 ### 1. 组件丰富 QMUI_iOS 包含了大量的 UI 控件,如表格视图、导航栏、标签页等,它们都经过精心设计和优化,易于集成,且性能优良。这些组件不仅可以节省开发时间,还能...

gitblog_00053的博客 895

QMUI_iOS_CodeSnippets:用于Xcode使用的iOS通用代码片段,其中也包含多个专用于QMUI iOS框架的代码片段

qmui-ios-codesnippets qmui-ios-codesnippets是一个QMUI团队日常工作中整理出来的Xcode的iOS通用代码片段集,其中也包含多个专用于iOS的QMUI框架的代码片段。 整理这个代码片段集的初衷有以下几点: 我们发现由于Xcode本身的功能不足,导致我们经常在重新编写一些系统父类方法时容易忘了调用super ,从而出现一些很难排查的诡异bug。 Xcode虽然有模糊匹配的代码提醒,但代码提醒只能帮你写方法名,而代码段还可以帮你替换一些替换的方法实现,或者直接移动光标到方法体内,省去一些光标操作。 一些常用的写法本身语法可能比较复杂,难以记忆,例如实现一个类的单例,使用swizzle来重写系统控件的方法,块在不同地方的语法不同等。 一些代码本身看似简单,但由于特别常用,所以使用代码段可以大大节省时间。 使用方式 Xcode的代码片段文件存放于~/

QMUI / QMUI_iOS框架学习(六)

微信的导航条的中心栏是可以处理多种状态的显示,有导航栏的界面都可以使用,研究一下他的源码。 拆出来花了很大的功夫,原因是相互之间层级引用太复杂了 。 有个QMUICommonViewController 类 里面引用了#import "QMUINavigationController.h" QMUINavigationTitleView 其中 QMUINavigationController 不

github_35041937的博客 1580

QMUI iOS——致力于提高项目 UI 开发效率的解决方案.zip

IOS开发

cmw500 lte非信令测试_WiFi信令测试在研发过程中的作用

  1、关于信令测试的故事  2016年的某天,某著名网络产品公司技术负责人致电寻求技术支持:我们的无线路由器遇到了一个困惑:我们某款路由器应用于实际WiFi网络中时,WiFi终端接入非常困难。但是我们使用测试工具检测此路由器,它的所有物理射频指标都非常优异。不知道是为什么?  我来到了测试现场看到:WiFi路由器受控于芯片公司的测试工具,其WiFi发射机指标在非信令测试仪上显示:无论功率、EVM...

weixin_39662263的博客 3926

QMUI / QMUI_iOS框架学习(二)

lauch图加载完成后,开始做tabbar控制器的部分- (void)createTabBarController { UIViewController *viewController = [[UIViewController alloc] init]; viewController.view.backgroundColor = [UIColor whiteColor]; s

github_35041937的博客 3435

实战解析:基于Python的APT攻击检测与ATT&CK框架应用

本文通过实战案例,详细解析了如何利用Python编程语言结合MITRE ATT&CK框架,构建一套针对高级持续性威胁(APT)的自动化检测与狩猎系统。文章涵盖了从环境搭建、核心检测逻辑编写、到模块化框架设计与主动威胁狩猎的全过程,为安全从业者提供了可落地的技术方案,以有效应对复杂的网络攻击。

weixin_29044157的博客 390

腾讯开源的Android UI框架——QMUI Android

各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊。嗯,先冷静捋一下,卖个关子。扯回正题,今天继续为大家推荐一个Github上的开源框架——QMUI Android,出品自腾讯广州研发部QMUI团队。https://github.com/QMUI如果是做Web开发的同学,应该会很熟悉QMUI所开源的QMUI Web框架,

技术视界 4万+

Android SSL证书固定实战:原理、方案与避坑指南

SSL/TLS协议是保障网络通信安全的基石,其核心原理是通过非对称加密和数字证书实现身份认证与数据加密。在移动应用开发中,为了防止中间人攻击,证书固定技术应运而生,它通过将服务器证书或公钥的哈希值预置在应用内,强制校验服务器身份,从而大幅提升通信链路的安全性。这一技术对于金融、电商等高安全要求场景尤为重要。本文聚焦Android平台,深入解析SPKI固定、Network Security Configuration与OkHttp CertificatePinner等主流方案,并针对证书更新、调试兼容等常见痛

weixin_33935636的博客 405

医疗AI知识库更新慢?提示工程架构师用Agentic AI自动更新的策略

我们的目标是用Agentic AI替代传统更新流程中的“重复劳动”,让医疗知识库(以知识图谱为例)能自动跟踪最新医学进展,把“更新周期从数月缩短到数天”。从PubMed/指南数据库自动抓取新文献;用提示工程从文本中提取结构化医学知识;自动校验新知识与旧知识的冲突;将通过校验的知识写入知识图谱。拆问题:先讲医疗知识库更新慢的3大根源;给方案:用Agentic AI设计4个“小助手”解决问题;讲原理:每个小助手的工作逻辑+提示工程技巧;做实战。

AI 原生应用开发的博客 1063

iOS多版本兼容终极指南:QMUI_iOS框架适配技巧揭秘

在iOS开发中,多版本兼容一直是开发者面临的重大挑战。随着iOS系统的不断更新,如何确保应用在不同系统版本上都能完美运行?腾讯开源的QMUI_iOS框架为我们提供了完美的解决方案!🎯 ## 什么是QMUI_iOS框架? QMUI_iOS是腾讯推出的一个高质量iOS UI组件库,专门为解决多版本iOS系统兼容性问题而生。这个框架包含了丰富的UI控件、实用的工具类和强大的主题管理功能,让开发者能

gitblog_01020的博客 1096

RTCA DO-160G标准详解:航空电子设备的全面环境适应性测试指南

第二章的主要目的是提供标准中使用的术语和定义。了解这些术语对于准确理解标准的要求至关重要,特别是在技术实施过程中。RTCA DO-160G 涉及多个学科的知识,包括航空、电子、电磁学和机械工程,因此需要确保使用的术语在所有学科中具有一致的定义。为了确保测试人员和工程师在执行测试时对所有条件和要求的理解一致,RTCA DO-160G 标准中定义了大量术语。环境应力:指的是设备在操作过程中可能遇到的外部物理或化学条件,包括温度、湿度、振动等。电磁干扰(EMI)

qq_41854911的博客 5284

如何利用QMUI_iOS实现高效的iOS应用崩溃监控与分析

QMUI_iOS是一个功能强大的iOS UI框架,提供了丰富的UI组件和工具类,帮助开发者快速构建高质量的iOS应用。除了UI组件外,QMUI_iOS还内置了完善的日志系统和错误处理机制,能够帮助开发者有效捕获和分析应用崩溃,提升应用稳定性。 ## 一、QMUI_iOS日志系统基础 QMUI_iOS的日志系统是崩溃监控的基础,通过`QMUILog`相关组件实现。在框架中,日志系统的核心配置位于

gitblog_00420的博客 1091

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(配置映射是因为用户只能通过 http 请求访问到服务器,不能直接访问到对应的容器,因此需要服务器端口与容器端口建立映射关系)这里我们有两种启动 redis 的方式,第一种是直接启动 redis ,第二种是以 AOF 持久化的方式启动容器(--appendonly yes),如下图。如果需要持续查看日志信息可以添加 -f 参数,例如:docker logs -f mn ,这里 mn 是自定义容器名称, ctrl + c 可以停止跟踪。

CYK_byte的博客 1万+

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1552

终极QMUI_iOS框架指南:打造高质量iOS应用的设计开发一体化方案

QMUI_iOS是一套致力于提高项目UI开发效率的解决方案,通过统一的配置管理和丰富的组件库,帮助开发者快速构建美观、一致的iOS应用界面。无论是新手还是有经验的开发者,都能通过QMUI_iOS框架显著提升开发效率,减少重复工作,专注于业务逻辑实现。 ## 为什么选择QMUI_iOS框架? QMUI_iOS框架为iOS开发带来了诸多优势,使其成为众多开发者的首选: - **设计开发一体化**

gitblog_00346的博客 1110

Spec Kit:GitHub 官方推出的规范驱动开发工具包,让 AI 编程真正可控、高效、高质量

先明确“做什么”和“为什么”,再考虑“如何做”。它通过一系列标准化命令(如/specify/plan/implement可验证的功能规格(spec)可执行的技术方案(plan)可追溯的开发任务(tasks)高质量的实现代码(code)最终实现“规范即代码,代码即规范”的闭环。📌项目地址许可证:MIT(完全开源,欢迎贡献)Spec Kit 代表了 GitHub 对AI 原生开发(AI-Native Development)AI 不应替代开发者,而应放大开发者的意图。

lpfasd123的博客 1715

项目推荐:提升iOS开发效率的神器 —— QMUI_iOS_Templates

项目推荐:提升iOS开发效率的神器 —— QMUI_iOS_Templates 在iOS开发领域,追求高效与代码质量是每一位开发者不变的宗旨。今天,我们来探讨一个能够显著提升开发速度和维护便捷性的开源宝藏——QMUI_iOS_Templates。这是一款专为提高iOS开发效率而设计的项目,特别是针对那些使用了QMUI框架的开发者们。 项目介绍 QMUI_iOS_Templates,正如其名,它是Q...

gitblog_00231的博客 629

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

QMUI_iOS 项目常见问题解决方案

QMUI_iOS 是由腾讯公司开发的一个开源项目,旨在提高 iOS 项目 UI 开发的效率。该项目提供了一系列的 UI 控件、工具方法和全局配置,帮助开发者快速搭建具备基本设计还原效果的 iOS 项目。QMUI_iOS 主要使用 Objective-C 语言编写,但也支持与 Swift 的混合使用。 ## 新手使用注意事项及解决方案 ### 1. 配置全局 UI 样式时遇到的问题 **问题描...

gitblog_00086的博客 1139

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

QMUI_iOS应用评分功能:SKStoreReviewController集成

在iOS应用开发中,应用评分功能是提升用户参与度和应用商店排名的关键环节。苹果官方提供的SKStoreReviewController框架为开发者提供了便捷的评分请求方式,而QMUI_iOS作为成熟的iOS UI框架,通过封装和扩展,进一步简化了这一功能的集成过程。 ## 评分功能的重要性 应用评分直接影响应用在App Store中的可见性和下载量。据统计,拥有4.5星以上评分的应用下载转化率

gitblog_00890的博客 1015

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

iOS开发必备:QMUI_iOS弹出菜单组件的终极使用指南

QMUI_iOS是腾讯开源的一款高质量iOS UI框架,其中的弹出菜单组件QMUIPopupMenuView为开发者提供了交互友好的操作面板解决方案。这个强大的弹出菜单系统能够帮助开发者快速构建美观实用的上下文菜单,提升用户体验。 ## 🚀 QMUI_iOS弹出菜单的核心优势 QMUIPopupMenuView不仅仅是一个简单的菜单组件,它提供了完整的**弹出菜单系统**,具有以下突出特点:

gitblog_00353的博客 775

QMUI iOS 教程:高效UI开发解决方案

**QMUI iOS** 是由深圳市腾讯计算机系统有限公司开发的一款旨在提升iOS项目UI开发效率的框架。通过提供全局UI配置、扩展UIKit组件、丰富的UI控件以及高效的工具方法,QMUI使得开发者能够更快地搭建具有高质量设计还原度的应用界面。该框架兼容从iOS 8到最新的iOS版本,确保了广泛的应用场景。 ## 2. 项目快速启动 ### 安装 要快速启动使用QMUI,首先你需要集成它到...

gitblog_00075的博客 1467
上一篇: QMUI / QMUI_iOS框架学习(四)
下一篇: 表驱动法
csdn_Damon
博客等级 码龄11年 37粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值