摘要

在学习小程序时,看到小程序中的一个样式属性 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.DetailDiscl ...

  2. swift 取消UIButton选中高亮状态

    objc可以用通过重写setHighlighted方法来达到当按钮选中时的高亮状态 -(void)setHighlighted:(BOOL)highlighted{ } swift中取消高亮状态 ov ...

  3. SWIFT Button的基本用法

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  4. iOS -Swift 3.0 -UIButton属性大全

    // //  ViewController.swift //  Swift-UIButton // //  Created by luorende on 16/9/9. //  Copyright © ...

  5. ios UIButton设置高亮状态下的背景色

    一,通过按钮的事件来设置背景色 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - (void)viewDidLoad {     [ ...

  6. swift学习之UIButton

    // //  ViewController.swift //  button // //  Created by su on 15/12/7. //  Copyright © 2015年 tian. ...

  7. iOS开发--Swift 最近项目开发中遇到的一些小问题与解决方法

    1, Swift 修改导航栏颜色 self.navigationController?.navigationBar.barTintColor 2, Swift button 属性设置时直接进行初始化 ...

  8. 【Facebook的UI开发框架React入门之九】button简单介绍(iOS平台)-goodmao

    --------------------------------------------------------------------------------------------------- ...

  9. 一键生成通用高亮代码块到剪贴板,快捷粘贴兼容 TT/WX/BJ 编辑器

    有些在线图文编辑器不支持直接插入代码块,但可以直接粘贴 HTML 格式的高亮代码块. 花了一点时间研究了一下各家的编辑器,规则却各不相同.有的要求代码块被包含于 <code> ... &l ...

  10. iOS - UIButton

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIButton : UIControl <NSCoding> @available(iOS 2.0, ...

随机推荐

  1. Cookie、Session、JWT在koa中的应用及实现原理

    目录 Cookie 重要属性 实现原理 cookie签名实现原理 注意事项 Session 实现原理 JWT 使用方式 组成 实际应用 实现原理 前端存储方式 cookie session local ...

  2. alpakka-kafka(6)-kafka应用案例,用户接口

    了解了kafka原理之后,对kafka的的应用场景有了一些想法.在下面的一系列讨论中把最近一个项目中关于kafka的应用介绍一下. 先介绍一下使用kafka的起因:任何进销存系统,销售开单部分都应该算 ...

  3. 阿里饿死了么Android面试凉经,两轮面完被虐哭了,怒清购物车。。。卸载饿死了么

    大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他漫不经心地复习了几个月,就去参加了饿了么面试,第二面结束后,嗯,挂了 ...

  4. 你的ES数据备份了吗?

    前言: 无论使用哪种存储软件,定期的备份数据都是重中之重,在使用ElasticSearch的时候,随着数据日益积累,存放es数据的磁盘空间也捉襟见肘, 此时对于业务功能使用不到的索引数据,又不能直接删 ...

  5. 热血动漫番太好看了!用Python爬取了1T的动漫,内存都爆了

    ​ ​ 最近被室友安利热血动漫番<终末的女武神>和<拳愿阿修罗>,太上头了周末休息熬夜看完了.不过资源不太好找,辣条一怒爬取了资源,这下可以看个够了.室友崇拜连连,想起了我的班 ...

  6. shell 获取当前路径 和 2>&1 &的作用

    #!/bin/bash current_path=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) nohup $curren ...

  7. gcc limits.h的bug定位看include_next和默认搜索路径

    手编的交叉编译工具链经常报一堆宏未定义,例如下面是编译gtest的时候报_POSIX_PATH_MAX宏未定义,有时还会上报SSIZE_MAX等宏未定义: googletest/src/gtest-f ...

  8. 【XSS-labs】Level 11-15

    Level 11 和level 10 差不多的页面,传参后查看页面源代码:依旧是第3个可以正常传参. 尝试level 10 的payload 发现 " 被实体化 可以打开控制台将第三个inp ...

  9. SQL 练习14

    查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 SELECT Student.SId,Student.Sname,t.不及格课程数,t.平均成绩 from Student, (SELECT ...

  10. 题解 e

    传送门 第一眼看貌似可以树剖,然而那个绝对值不知怎么维护 求最小连通块我只会\(k^2\) 主席树貌似可以用来查询区间内与某个数差的绝对值的最小值? 确实,每次查大于等于该数的最小数和小于等于该数的最 ...