摘要

在学习小程序时,看到小程序中的一个样式属性 hover-class,通过设置这个属性,就可以给点击的控件添加一个高亮效果。所以也就萌生了在 Swift 也实现一个类似的功能的想法,开干。

下面代码是给 view 控件添加一个高亮效果,高亮时,页面的背景颜色会 0.8 的透明度显示

// html 页面
<view class="tool-bar my-class" hover-class="hover"hover-stay-time="50">
<image src="{{icon}}"/>
<text>{{title}}</text>
</view>
// css 页面
.hover {opacity: .8;
}

设置 Button

先敲定一个简单的需求,设置一个按钮的背景颜色,当按钮高亮状态时,背景颜色 0.8 透明度显示。

看 UIButton 类中,setBackgroundImage(, for: ) 函数,可以让按钮在默认状态(.normal)和高亮状态(.highlighted)下,显示不同的背景图片,这里可以通过 color 来创建纯色的图片处理。

// MARK: - 设置按钮高亮
/// 设置按钮背景和高亮状态颜色
///
/// 设置的 color 是按钮背景颜色,高亮状态下,背景颜色会有 0.8 的 alpha
///
/// - Parameter color: 背景颜色
func setBackgroundAndHighlighted(with color: UIColor) {self.btn.setBackgroundImage(getImageFrom(color: color), for: .normal)self.btn.setBackgroundImage(getImageFrom(color: color.withAlphaComponent(0.8)), for: .highlighted)
}

实现代码的时候,使用了函数 withAlphaComponent,它属于 UIColor 类的,达到的效果是,将 color 颜色设置它的 alpha,返回一个新的 color 对象。

这个方法专门测试一下啊,比如 0.8 的 white,使用这个函数设置成 0.6 时,返回的是 0.6 的 white,而不是 0.8x0.6 的 white。

创建单色 image

下面代码是创建单色 image,给到按钮,这里使用的是 UIGraphics 框架处理图片。

  /// 设置单色图片/// - Parameter color: 颜色/// - Returns: 返回该颜色图片func getImageFrom(color: UIColor) -> UIImage? {let rect = CGRect(x: 0, y: 0, width: 1, height: 1)UIGraphicsBeginImageContext(rect.size)guard let context = UIGraphicsGetCurrentContext() else {print(" UIGraphicsGetCurrentContext 不存在")UIGraphicsEndImageContext()return nil}context.setFillColor(color.cgColor)context.fill(rect)let img = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()return img}

Highlighted(高亮)

需求是实现完了,接下来看一下 Highlighted 是什么:

highlighted 是控件的高亮显示,这里首先明确了它属于 UIControl 类。那么怎么理解高亮显示呢?释义这样说,当触摸事件进入控件的边界时,控件会高亮显示;当触摸事件离开(比如点击按钮时,松开按钮,touch-up)或者超出控件的边界时,控件会失去高亮显示。并且可以通过 isHighlighted 属性查看控件是否高亮状态,也可以设置它,让控件保持高亮或者非高亮状态。

Event(事件)

highlighted 的释义中多次提到触摸事件,那么顺势看看能影响到高亮的几个触摸事件,先上总结:

  • touchDown 是手指按到控件的操作;
  • touchDrag 是手指在控件中拖动的操作;
  • touchUp 是手指从控件中松开的操作;
  • 最后一个 touchCancle 就是关闭操作。

如果理解,就简单过一下代码块

/// 点击事件
public static var touchDown: UIControl.Event { get }
/// 重复点击事件
public static var touchDownRepeat: UIControl.Event { get }
/// 被拖动到控件边界内事件
public static var touchDragInside: UIControl.Event { get }
/// 被拖动到控件边界外事件
public static var touchDragOutside: UIControl.Event { get }
/// 被拖动到控件边界事件
public static var touchDragEnter: UIControl.Event { get }
/// 手指从控件内拖动到它的边界外事件
public static var touchDragExit: UIControl.Event { get }
/// 当手指在控件边界内的事件
public static var touchUpInside: UIControl.Event { get }
/// 当手指超出控件边界中的事件
public static var touchUpOutside: UIControl.Event { get }
/// 取消当前触摸的系统事件
public static var touchCancel: UIControl.Event { get }

依据 heighlighted 释义并多次测试之后,推断当 touchDown 时候 heighlighted 高亮, 当 touchDrageOutsidetouchUpInside 或者 touchDragExit 时,heightlighted 没有高亮效果。

之后就可以设置这几个点击事件,去自定义是否高亮事件,以及做对应的事件处理。

Button 为什么可以设置高亮?

看代码结构,UIButton 是继承自 UIControl 的,而 UIButton 类中只是设置样式等函数,关于 Event 事件都在 UIControl 类中。

那么就可以大致梳理一下,UIControl 中有监听 Event 事件的方法,通过监听 Event 的不同 State,设置 isHighlighted,然后 isHighlighted 的属性监听检测到变化时,处理 UIButton 中提前设置的代码。

由此可以总结,UIButton 就是一个对 UIControl 和 View 的封装,只要是继承 UIControl 类的子类,都可以使用它的高亮属性,或者自定义高亮监听相关事件。

Swift-Button 的 highlighted(高亮)相关推荐

  1. swift button一些简单设置

    1,按钮的创建 (1)按钮有下面四种类型: UIButtonType.ContactAdd:前面带"+"图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果 UIButtonType. ...

  2. 关于UIButton的highlighted状态的总结

    前两天写项目的时候纠结于button的highlighted属性不能保证它的高亮状态,最后用反复更新Default的背景图片的方法解决的 今天找到原因了, 在api中关于highlighted有这样的 ...

  3. html button 隐藏_java servlet与html数据交互初体验

    最近作业要做一个servlet与html前后端交互的简易网页.实现的功能就是通过点击按钮进行图片切换,还可以把后台的数据显示在前端. 需求比较简单 1. 程序运行流程与功能: 界面效果如下 以一张效果 ...

  4. Swift 能不能取代 Objective-C?

    其实到现在为止 Swift 离替代 Objective-C 还是很遥远,因为 Apple 内部一直在用 Objective-C 来做一些 Framework 的开发,低层也不可能用 Swift 实现 ...

  5. 无论你是否主力 Swift, 这些事情你都可以了解一下

    Swift 再等等?我的答案是:快上车 - 简书 主力 Swift 或许真的要等一等 - 知乎专栏 上一周有两篇文章, 分别讨论了大家在现阶段到底该不该用 Swift 在这里我不是想给出一个答案该不该 ...

  6. Android listView中的button点击事件

    如果listView中的item有button控件,那么如何获取listView中的button控件?又如何在点击button时定位当前的item? 在listview中的listitem设置事件响应 ...

  7. 【MAPBOX基础功能】14、mapbox点击面图层高亮指定的面

    前言 官网指引,生成accesstoken,下载相关依赖请翻阅[https://blog.csdn.net/weixin_44402694/article/details/125414381?spm= ...

  8. 【MAPBOX基础功能】13、mapbox点击线图层高亮指定的线段

    前言 官网指引,生成accesstoken,下载相关依赖请翻阅[https://blog.csdn.net/weixin_44402694/article/details/125414381?spm= ...

  9. iOS - UITextField

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextInput, NSCoding>@avai ...

  10. java 无符号转有符号_java有符号无符号的转换

    数据处理中常常遇到基本数据类型的操作,java都是有符号的数据,而与下位机通信中常常遇到无符号的比如uint8, uint16,uint32等等 1.为了完成这个功能还专门采用ByteBuffer的方 ...

最新文章

  1. swift 中拨电话的实现
  2. js 判断手机横竖屏的实现方法(不依赖任何其他库)
  3. 对于java的命名规范(标识符)
  4. Spirng MVC +Velocity 表单绑定命令对象
  5. java db类_Java-jdbc-DBUtils工具类介绍
  6. CountVectorizer,Tf-idfVectorizer和word2vec构建词向量的区别
  7. 第1节 kafka消息队列:7、kafka的消费模型
  8. KMP算法(待优化)--2015年7月25日14:04:25V1.0版
  9. Modelsim-Altera仿真设置
  10. 基于cocos2d-x引擎的游戏框架设计
  11. java基础--接口
  12. 四川大学转专业到计算机学院面试,2016年本科生转专业工作面试通知
  13. 用户收货地址管理后端实现
  14. 用GridView做国际象棋
  15. C++写的简易的控制台游戏
  16. 简介 IndexedDB 及详解 IndexedDB 在实际项目中可能存在的问题与解决方案
  17. 腾讯自媒体平台:腾讯QQ看点上线创作中心
  18. 会声会影2023旗舰版新增七大功能介绍
  19. 【转载】三种证明欧拉恒等式的方法(3 methods of proving Euler's Formula )
  20. PDF怎么转换成PPT?分享给你两个小妙招

热门文章

  1. source insight破解问题汇总与解决
  2. 计算机可爱的企鹅教案,可爱的企鹅教案
  3. 2022CCPC广州站H - GameX Gym - 104053H
  4. Jetson TX1配置与踩坑历程
  5. 对讲机使用过程中的常见故障及排除故障的解决方法
  6. Python bisect模块详解
  7. http session介绍
  8. 面试君与面试官的分歧:innodb支持行锁就不锁表么?
  9. webstorm operation not permitted错误
  10. 上千Tile的倾斜模型浏览提速,告别一块一块往外蹦的尴尬