2.Swift基础控件:图标文字按钮

Swift图标标题按钮

一、自定义IconTitleButton类


import Foundation/*
枚举 设置 图片的位置
*/
enum ButtonImagePosition : Int  {case imageTop = 0case imageLeftcase imageBottomcase imageRight
}
extension UIButton {/**type :image 的位置Space :图片文字之间的间距*/
func setImagePosition(type:ButtonImagePosition,Space space:CGFloat)  {let imageWith :CGFloat = (imageView?.frame.size.width)!let imageHeight :CGFloat = (imageView?.frame.size.height)!var labelWidth :CGFloat = 0.0var labelHeight :CGFloat = 0.0labelWidth = CGFloat(titleLabel!.intrinsicContentSize.width)labelHeight = CGFloat(titleLabel!.intrinsicContentSize.height)var  imageEdgeInsets :UIEdgeInsets = UIEdgeInsets()var  labelEdgeInsets :UIEdgeInsets = UIEdgeInsets()switch type {case .imageTop:imageEdgeInsets = UIEdgeInsets.init(top: -labelHeight - space/2.0, left: 0, bottom: 0, right:  -labelWidth)labelEdgeInsets =  UIEdgeInsets.init(top:0, left: -imageWith, bottom: -imageHeight-space/2.0, right: 0)break;case .imageLeft:imageEdgeInsets = UIEdgeInsets.init(top:0, left:-space/2.0, bottom: 0, right:space/2.0)labelEdgeInsets =  UIEdgeInsets.init(top:0, left:space/2.0, bottom: 0, right: -space/2.0)break;case .imageBottom:imageEdgeInsets = UIEdgeInsets.init(top:0, left:0, bottom: -labelHeight-space/2.0, right: -labelWidth)labelEdgeInsets =  UIEdgeInsets.init(top:-imageHeight-space/2.0, left:-imageWith, bottom: 0, right: 0)break;case .imageRight:imageEdgeInsets = UIEdgeInsets.init(top:0, left:labelWidth+space/2.0, bottom: 0, right: -labelWidth-space/2.0)labelEdgeInsets =  UIEdgeInsets.init(top:0, left:-imageWith-space/2.0, bottom: 0, right:imageWith+space/2.0)break;}self.titleEdgeInsets = labelEdgeInsetsself.imageEdgeInsets = imageEdgeInsets}}

二、使用

import UIKitclass IconTitleButtonController: BaseViewController {override func viewDidLoad() {super.viewDidLoad()view.addSubview(btn1)view.addSubview(btn2)view.addSubview(btn3)view.addSubview(btn4)}lazy var btn1:UIButton =  {let btn = UIButton.init(frame: CGRect.init(x: 50, y: 100, width: 120, height: 40))btn.backgroundColor = .graybtn.setImage(UIImage.init(named: "tabbar_2a"), for: .normal)btn.setTitle("测试标题", for: .normal)btn.setImagePosition(type: .imageLeft, Space: 5)return btn}()lazy var btn2:UIButton = {let btn = UIButton.init(frame: CGRect.init(x: 50, y: 160, width: 120, height: 40))btn.backgroundColor = .graybtn.setImage(UIImage.init(named: "tabbar_2a"), for: .normal)btn.setTitle("测试标题", for: .normal)![]()btn.setImagePosition(type: .imageRight, Space: 5)return btn}()lazy var btn3:UIButton = {let btn = UIButton.init(frame: CGRect.init(x: 50, y:220, width: 120, height: 80))btn.backgroundColor = .graybtn.setImage(UIImage.init(named: "tabbar_2a"), for: .normal)btn.setTitle("测试标题", for: .normal)btn.setImagePosition(type: .imageTop, Space: 10)return btn}()lazy var btn4:UIButton = {let btn = UIButton.init(frame: CGRect.init(x: 50, y: 320, width: 120, height: 80))btn.backgroundColor = .graybtn.setImage(UIImage.init(named: "tabbar_2a"), for: .normal)btn.setTitle("测试标题", for: .normal)btn.setImagePosition(type: .imageBottom, Space: 10)return btn}()
}

三、效果图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并查集 + Tarjan算法

并查集 Tarjan 算法 并查集是一种用于找出一个森林(图)中树(连通分支)的个数的算法,也可用于判断两个节点是否在同一棵树上。它在每一棵树(连通分支)上选择一个节点作为本棵树(连通…

leetcode代码记录(买卖股票的最佳时机

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股…

蓝桥-时间显示

目录 题目链接 代码 题目链接 1.时间显示 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std;int main() {long long x;cin>>x;int h,m,s;x x / 1000 % (3600*24); // 毫秒化秒&#xff0c;并且保留最后一天的时间h x / 3600; //求得…

python中OrderedDict有序字典类

OrderedDict 是 Python 标准库 collections 模块中的一个类&#xff0c;它实现了有序字典。与普通字典&#xff08;dict&#xff09;不同&#xff0c;OrderedDict 记住了元素被插入时的顺序&#xff0c;因此你可以按照元素被添加的顺序来迭代遍历字典的元素。 OrderedDict 的主…

第四百四十三回

文章目录 1. 概念介绍2. 思路与方法2.1 整体思路2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义Action菜单"相关的内容&#xff0c;本章回中将介绍如何获取屏幕相关参数.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

Qtxlsx第三方库的安装和使用

本文仅作为一个记录&#xff0c;安装QtXlsx方便操作excel&#xff0c;主要参考了这篇博文&#xff1a;https://blog.csdn.net/u014779536/article/details/111769792 1&#xff0c;下载安装Perl脚本Strawberry Perl for Windows&#xff0c;默认安装strawberry-perl-5.30.0.1-…

MySQL Payload

常见Payload Version SELECT version Comment SELECT 1 -- commentSELECT 1 # commentSELECT /*comment*/1 Space 0x9 0xa-0xd 0x20 0xa0 Current User SELECT user()SELECT system_user()SELECT current_role() List User SELECT user FROM mysql.user Current Database SELEC…

Vue中的ref与reactive

在 Vue 中&#xff0c;ref 和 reactive 是用于处理响应式数据的两个不同的 API。 1. ref ref 是 Vue 3 中引入的 API&#xff0c;用于创建一个响应式的引用对象。它接收一个初始值作为参数&#xff0c;并返回一个包含了一个 .value 属性的对象。这个 .value 属性持有着实际的值…

程序·人生

诡异之极 2024.03.12 清新环境&#xff08;股票代码002573&#xff09;委托卖出 20000股&#xff0c;委托价4.58&#xff0c;当日最高价4.57 2024.03.11 清新环境&#xff08;股票代码002573&#xff09;委托卖出 20000股&#xff0c;委托价4.55&#xff0c;当日最高价4.54 …

汉明码检错与纠错的结论(hamming code)

假如一组二进制数据为101&#xff0c;另外一组为111&#xff0c;那么显然把第一组的第二位数据0改成1就可以变成第二组数据111&#xff0c;所以两组数据的汉明距离就为1 简单点说&#xff0c;汉明距离就是一组二进制数据变成另一组数据所需的步骤数&#xff08;它表示两个相同长…

策略模式图

策略模式 小小的图解 主要的三个角色 Strategy—抽象策略角色ConcreateStrategy—具体策略角色Context—上下文角色 封装了对具体策略的调用可以使用set的依赖注入也可以使用构造方法 核心是上下文角色 只要调用上下文角色就行&#xff0c;实现解耦 策略 工厂 将上下文角…

深入理解MP4视频文件裁剪原理[下下]

深入理解MP4视频文件裁剪原理[上] 深入理解MP4视频文件裁剪原理[中] 深入理解MP4视频文件裁剪原理[下] 深入理解MP4视频文件裁剪原理[下下] 3.22 stco box* stco box记录了每个chunk在MP4文件中的偏移量。如下图24: 图24 这里的offset指的是chunk的起始位置相对于整个MP4文…

Pytoch安装记录

使用pycharm 1、CUDA的安装 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 选择对应的版本 选择对应的版本进行下载&#xff1a; 有3个多G cuda的安装需要注意&#xff0c;如果没有安装vs&#xff0c;则需要选择自定义安装&#xff0c;在自定义的安装中取消 安…

【系统架构师】-系统可靠性分析与设计

1、可靠性与可用性区别 1、系统可靠性&#xff1a;系统在规定时间内及规定的环境下&#xff0c;完成规定功能的能力&#xff0c;即系统无故障运行的概率 2、系统可用性&#xff1a;在某个给定时间点上系统能够按照需求执行的概率。 可靠性分为软件、硬件可靠性 2、可靠性指标…

观察者模式 C++

&#x1f442; Honey Honey - 孙燕姿 - 单曲 - 网易云音乐 目录 &#x1f33c;前言 &#x1f33c;描述 &#x1f382;问题 &#x1f4aa;解决方案 &#x1f232;现实场景 代码 场景1 -- 报纸发行 场景 解释 代码 场景2 -- 气象资料发布 场景3 -- 过红绿灯 &#x…

【200】Java8 调用 Gson2.10 读取 JSON 数组的六种方法。

准备工作 我们先看一下本文例子中的 JSON 文件&#xff1a;cars.json [{"no": "鲁B0001","color": "红色","code": 1},{"no": "鲁B0002","color": "黑色","code": 2},…

视频分块上传Vue3+SpringBoot3+Minio

文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块&#xff0c;依次上传到后端&#xff0c;后端将其保存到文件系统。前…

C++读取.bin二进制文件

C读取.bin二进制文件 在C中&#xff0c;可以使用文件输入/输出流来进行二进制文件的读写操作&#xff0c;方便数据的保存和读写。 //C读取bin二进制文件 int read_bin() {std::ifstream file("data_100.bin", std::ios::in | std::ios::binary);if (file) {// 按照…

【拓扑空间】示例及详解1

例1 度量空间的任意两球形邻域的交集是若干球形邻域的并集 Proof&#xff1a; 任取空间的两个球形邻域、&#xff0c;令 任取,令 球形领域 例2 规定X的子集族,证明是X上的一个拓扑 Proof&#xff1a; 1. 2., &#xff08;若干个球形邻域的并集都是的元素&#xff0c;元素…

SSM 项目学习(Vue3+ElementPlus+Axios+SSM)

文章目录 1 项目介绍1.1 项目功能/界面 2 项目基础环境搭建2.1 创建项目2.2 项目全局配置 web.xml2.3 SpringMVC 配置2.4 配置 Spring 和 MyBatis , 并完成整合2.5 创建表&#xff0c;使用逆向工程生成 Bean、XxxMapper 和 XxxMapper.xml2.6 注意事项和细节说明 3 实现功能 01-…