UIKit之UIButton

功能需求:

点击按钮切换按钮的文字和背景图片,同时点击上下左右可以移动图片位置,点击加或减可以放大或缩小图片。

分析:

  • 实现一个UIView的子类即可,该子类包含多个按钮。

实现步骤:

  1. 使用OC语言,故创建cocoa Touch类型文件。Xcode会创建.h文件和.m文件:UIButtonTest类。
    在这里插入图片描述

  2. 图片资源导入。
    拖动文件夹到Assets文件夹下。之后项目中直接通过图片名字即可获得【即使图片处于上级文件夹下】。
    在这里插入图片描述

  3. 实现该类。
    a. 声明成员变量:在.h文件中的@interface~@end之间,类型是strong,若使用weak,则运行时样式消失。

// 该类继承自UIView,因它带着很多按钮组件
// 点击按钮实现背景和文字变化是因为它的组件绑定了动画,整个应该是个带着一堆组件的View
// 带图片的btn
@interface UIButtonTest : UIView
// @property自动生成get、setter方法
@property(strong, nonatomic) UIButton *btn;
@property(strong, nonatomic) UIButton *btn1;
@property(strong, nonatomic) UIButton *btn2;
@property(strong, nonatomic) UIButton *btn3;
@property(strong, nonatomic) UIButton *btn4;
@property(strong, nonatomic) UIButton *btn5;
@property(strong, nonatomic) UIButton *btn6;

@end

b. .m文件中,在@implementation ~@end之间实现初始化方法:为按钮控件申请内容空间、定义大小、添加背景图片、添加动画、绑定点击函数等。**该Demo必须在初始化时设置好背景图片和文字,只设置点击函数的变化会导致刚启动显示非点击前**
@implementation UIButtonTest

-(instancetype) initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    // 视图中有个按钮,按钮点击了没反应?GPT4实现一下
    if(self){
        /// 初始化btn1:带bgImage
            /// 初始化每个组件,通过self.或_来获得
            /// 如果类继承自组件本身,则通过self即可
            /// 初始化btn内容,如果不设置,初始的状态不一定
            ///如果是成员,直接用_成员名字,或者self.均可,注意是view,_方式安全,不会出发getter和setter方法
            /// CGRect:位置、大小
        _btn = [[UIButton alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
        [_btn setTitle:@"点击前" forState:UIControlStateNormal];
        // 文字设置
        [_btn setTitleColor:[UIColor blackColor]  forState:UIControlStateNormal];
        // bgImage
        [_btn setBackgroundImage:[UIImage imageNamed:@"1.jpg"] forState:UIControlStateNormal];
        // 动画:绑定函数,点击事件,在btn上调用,加到self上
        [_btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
        
        /// btn1~6 初始化和设置大小
        _btn1 = [[UIButton alloc] initWithFrame:CGRectMake(80, 350, 50, 50)];
        _btn2 = [[UIButton alloc] initWithFrame:CGRectMake(80, 400, 50, 50)];
        _btn3 = [[UIButton alloc] initWithFrame:CGRectMake(30, 400, 50, 50)];
        _btn4 = [[UIButton alloc] initWithFrame:CGRectMake(130, 400, 50, 50)];
        _btn5 = [[UIButton alloc] initWithFrame:CGRectMake(200, 349, 49, 49)];
        _btn6 = [[UIButton alloc] initWithFrame:CGRectMake(200, 402, 49, 49)];
        /// 设置背景图片
        [_btn1 setBackgroundImage:[UIImage imageNamed:@"shang.jpg"] forState:UIControlStateNormal];
        [_btn2 setBackgroundImage:[UIImage imageNamed:@"xia.jpg"] forState:UIControlStateNormal];
        [_btn3 setBackgroundImage:[UIImage imageNamed:@"zuo.jpg"] forState:UIControlStateNormal];
        [_btn4 setBackgroundImage:[UIImage imageNamed:@"you.jpg"] forState:UIControlStateNormal];
        [_btn5 setBackgroundImage:[UIImage imageNamed:@"jia.jpg"] forState:UIControlStateNormal];
        [_btn6 setBackgroundImage:[UIImage imageNamed:@"jian.jpg"] forState:UIControlStateNormal];
        /// 绑定函数
        [_btn1 addTarget:self action:@selector(btn1Clicked) forControlEvents:UIControlEventTouchUpInside];
        [_btn2 addTarget:self action:@selector(btn2Clicked) forControlEvents:UIControlEventTouchUpInside];
        [_btn3 addTarget:self action:@selector(btn3Clicked) forControlEvents:UIControlEventTouchUpInside];
        [_btn4 addTarget:self action:@selector(btn4Clicked) forControlEvents:UIControlEventTouchUpInside];
        [_btn5 addTarget:self action:@selector(btn5Clicked) forControlEvents:UIControlEventTouchUpInside];
        [_btn6 addTarget:self action:@selector(btn6Clicked) forControlEvents:UIControlEventTouchUpInside];
        
        // 初始化btn2、btn3、btn4、btn5
        // 本身是view,需要添加组件进去
        [self addSubview:_btn];
        [self addSubview:_btn1];
        [self addSubview:_btn2];
        [self addSubview:_btn3];
        [self addSubview:_btn4];
        [self addSubview:_btn5];
        [self addSubview:_btn6];
    }
    return self;
}


c. 实现各点击函数:
1> 点击切换背景图片:该函数实现需要==借助bool值==,来回更改点击前和点击后的样式。
2> 点击放大和缩小:center等属性可以根据中心位置来进行放大和缩小。本人使用的frame直接调整根据原始坐标(x, y)来调整。
3> frame变化:frame位置变化和大小变化必须先创建新的frame,然后把旧的盖掉,不能直接在原本的frame上修改。
// 带图片的按钮点击后的变化
// 点击后重新设置title、bgImage
- (void)btnClicked{
    // 点击前后
    static BOOL isClicked = NO;
    if(isClicked){
        [_btn setTitle:@"点击前" forState:UIControlStateNormal];
        [_btn setBackgroundImage:[UIImage imageNamed:@"1.jpg"] forState:UIControlStateNormal];
    }
    else{
        // 状态常识不同样式:hightlight,可设置
        [_btn setTitle:@"点击后" forState:UIControlStateNormal];
        [_btn setBackgroundImage:[UIImage imageNamed:@"2.jpg"] forState:UIControlStateNormal];
    }
    isClicked = !isClicked;
}

// 移动、修改大小,必须创建新的矩形框体,再做赋值
- (void)btn1Clicked{
    CGRect originalFrame = self.btn.frame;
    originalFrame.origin.y -= 10;
    self.btn.frame = originalFrame;
}

- (void)btn2Clicked{
    CGRect originalFrame = self.btn.frame;
    originalFrame.origin.y += 10;
    self.btn.frame = originalFrame;

}

- (void)btn3Clicked{
    CGRect originalFrame = self.btn.frame;
    originalFrame.origin.x -= 10;
    self.btn.frame = originalFrame;
}

- (void)btn4Clicked{
    CGRect originalFrame = self.btn.frame;
    originalFrame.origin.x += 10;
    self.btn.frame = originalFrame;
}

- (void)btn5Clicked{
    CGRect originalFrame = self.btn.frame;
    originalFrame.size.width += 10;
    originalFrame.size.height += 10;
    self.btn.frame = originalFrame;
}

- (void)btn6Clicked{
    CGRect originalFrame = self.btn.frame;
    originalFrame.size.width -= 10;
    originalFrame.size.height -= 10;
    self.btn.frame = originalFrame;
}
  1. 调用并创建自定义UIView。
    a. 在ViewController中import该文件。
    b. 在viewDidLoad()函数中创建该类型变量,申请空间并实例化。定义视图大小。(可以设置背景色,使其显示)
    c. 将子视图加入当前视图中
@implementation ViewController

// 整体视图加载处
- (void)viewDidLoad {
    [super viewDidLoad];
    UIButtonTest *myBtnsView = [[UIButtonTest alloc] initWithFrame:CGRectMake(20, 20, 300, 600)];
    [myBtnsView setBackgroundColor: [UIColor blueColor]];
    // 自定义按钮添加到视图
    [self.view addSubview:myBtnsView];
}

@end
  1. Demo结果展示:
    https://s31.aconvert.com/convert/p3r68-cdx67/gqfq1-4j8f8.gif
    在这里插入图片描述

知识点和问题:

  1. UIButton
  1. UIButton没有Label,按钮上显示的内容为。
  2. 按钮有多种状态,点击前后,默认点击后是高亮,但自己可以设置均为normal。
  3. frame可以变大小、位置
    center只能变位置,获取到的是中心点的坐标
    bounds只能变大小,在中心点位置。
    transform位置大小、旋转等都可
  4. 修改frame必须创建新的,利用新的盖掉旧的。
  5. 本人实现该Demo创建了一个UIView,该UIView包含了一系列UIButton,要显示这些UIButton必须添加到子视图中去。且在UIViewController中创建该自定义UIView后,仍然要添加该UIView到子视图中去。
  6. 点击按钮没反应:
    按钮外的视图大小没有将按钮的坐标区域完全包含,调整view大小即可。
  1. @property:
  1. 使用@property声明变量后,在@implement中获取时,可以通过self和_name的方式获取,_name更安全,不会触发setter和getter。
  2. 组件建议声明为strong类型,如果为weak,该Demo中按钮不显示。

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

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

相关文章

【碳化硅】陷阱(traps)对SiC MOSFET阈值电压漂移的影响

这篇文章是关于硅碳化物(SiC)金属氧化物半导体场效应晶体管(MOSFET)的阈值电压漂移问题的研究。文章的主要目的是通过研究不同的陷阱(traps)对阈值电压漂移的影响,来解决SiC MOSFET的可靠性问题。 摘要(Abstract) 文章提出了一种研究方法,用于分析影响SiC MOSFET阈值…

YUV中Y颜色模型的采样

YUV的特点 相对于表示颜色的GUI, YUI将亮度(用Y表示)与色调(用U和V表示)分开来表示。又因为人类视网膜上的视网膜杆细胞要多于视网膜锥细 胞,说得通俗一些,视网膜杆细胞的作用就是识别亮度&…

【Delphi 爬虫库 6】使用正则表达式提取猫眼电影排行榜top100

正则表达式库的简单介绍 正则表达式易于使用,功能强大,可用于复杂的搜索和替换以及基于模板的文本检查。这对于输入形式的用户输入验证特别有用-验证电子邮件地址等。您还可以从网页或文档中提取电话号码,邮政编码等,在日志文件中…

Tiff文件解析和PackBits解压缩

实现了Tiff图片文件格式的解析,对Tiff文件中的PackBits压缩格式进行解压缩,对Tiff文件中每一个Frame转换成BufferedImage显示。 Java语言实现,Eclipse下开发,AWT显示图片。 public static TIFF Parse(final byte[] bytes) throw…

【Rollup】用rollup从0到1开发一个js插件并发布到npm

Rollup 是一个 JavaScript 模块打包器,专注于打包 ES6 模块将其编译回多种模块化格式,尤其适合打包库和框架,因为它可以生成更小、更高效的代码,并且特别适合将代码打包成可在浏览器中使用的库。 从0到1开发js插件 1.创建文件夹…

解决docker安装Wordpress速度过慢的问题

先可以在dockerhub上查看Wordpress的详情: Dockerhttps://hub.docker.com/search?qwordpress 具体速度慢的问题如下: 现在打开docker右上角的设置图标,并进入docker engine,添加如下代码: "registry-mirrors&…

贪心算法----摆动序列

今日题目:leetcode376 点击跳转题目 观察样例2: 发现最长摆动序列都是极大值和极小值 再加上两个端点,那么我们保证每次都能选择到每个极值点,就能从局部最优推广全局最优了! 但是还有一些细节情况需要注意&#xff…

社工库信息查询

此网站需要注册账号,新用户注册送3点券,每日签到可获得1.5点券。也可通过充值来查 我这里有方法可以利用缺陷来无限获取点券查人

土地档案管理关系参考论文(论文 + 源码)

【免费】javaEE土地档案管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296786 土地档案管理关系 摘 要 研究土地档案管理关系即为实现一个土地档案管理系统。土地档案管理系统是将现有的历史纸质档案资料进行数字化加工处理,建成标准化的…

LoRa模块学习

什么是LoRa调制 LoRa(Long Range,远距离)是一种调制技术,与同类技术相比,提供更长的通信距离。调制是基于扩频技术,线性调制扩频(CSS)的一个变种,具有前向纠错&#xff…

C++数据结构之链表树图的存储

本文主要介绍用数组存储,结构只做简单介绍 目录 文章目录 前言 结构体实现 1、链表的存储 2、树的存储 3、图的存储 数组实现 1、链表实现 2、树和图的实现 总结 前言 在正常工程中,我们通常使用结构体或者类,来定义并使用如链表…

1_1. Linux简介

1_1. Linux简介 文章目录 1_1. Linux简介1. 我们用linux来干嘛2. 计算机组成3. 操作系统4. Linux哲学思想5. Linux目录6. Linux分区类型 1. 我们用linux来干嘛 1. 大家都知道linux是一个操作系统,它是一个基础的软件,操作系统是硬件与应用程序的中间层。…

音频—WAV格式及写入wav文件代码实现

1.RIFF规范 FIFF 是 Resource Interchange File Format(资源交换文件格式)的简称。RIFF 是一种文件格式规范,用于在计算机系统之间交换和存储多媒体资源。WAV 文件格式是 Microsoft 的 RIFF 规范的一个子集。 RIFF 规则定义了文件的结构和数…

PyQt6--Python桌面开发(7.QTextEdit多行富文本框控件)

QTextEdit多行富文本框控件 保存文件到本地QLine多行文本框.ui import sys import time from PyQt6.QtGui import QValidator,QIntValidator from PyQt6.QtWidgets import QApplication,QLabel,QLineEdit,QTextEdit from PyQt6 import uic,QtGuiif __name__ __main__:appQApp…

视频监控系统中,中心录像服务器的录像文件实际大小和理论值相差很大的问题解决

目录 一、现象描述 二、视频监控的录像文件计算 (一)计算方法 1、仅视频部分 2、视频和音频部分 3、使用平均码率 (二)计算工具 1、关注威迪斯特公众号 2、打开“计算容量”的小工具 三、原因分析 (一&…

超级好看的html网站维护源码

源码介绍 好看的html网站维护源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 好看的html网站维护源码

Codeforces Round 605 (Div. 3) A~D

本人水平不高,开这个专栏主要是督促自己补题,有些题对目前的我来说还比较难,还补不动,等以后能力上来了再补。。。 原题链接:Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

Leedcode题目:移除链表元素

题目: 这个题目就是要我们将我们的链表中的值是val的节点删除。 我们题目提供的接口是 传入了指向一个链表的第一个节点的指针,和我们要删除的元素的值val,不只要删除第一个, 思路 我们这里可以创建一个新的链表,…

第四百九十九回

文章目录 1. 概念介绍2. 使用方法2.1 固定样式2.2 自定义样式 3. 示例代码4. 内容总结 我们在上一章回中介绍了"GetMaterialApp组件"相关的内容,本章回中将介绍使用get显示SnackBar.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在介…

基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器探索(更新版)

一、引言 在当今数字化快速发展的时代,企业对于展示自身形象、产品细节以及提升客户体验的需求日益增强。酷企秀场景可视化DIY设计器,以其强大的功能和灵活的定制性,为企业提供了从VR全景展示到地图可视化、电子画册制作等一系列数字化解决方…