MCActivityButton: Objective-C中动画UIButton的自定义实现

需积分: 5 0 下载量 110 浏览量 更新于2024-11-27 收藏 430KB ZIP 举报
资源摘要信息:"MCActivityButton是一个基于Objective-C的UIButton子类扩展,用于实现一个在用户交互时显示动画的按钮。在iOS应用中,按钮(UIButton)是用户界面(UI)中用来接收用户输入的基本元素之一。标准的UIButton提供了基本的交互功能,但开发者可能会需要更丰富的视觉反馈,以增强用户体验。MCActivityButton正好提供了这样的功能,它在按钮被点击时会启动一个自定义的动画效果,通过活动指示器(activity indicator)的形式来告知用户正在进行的操作。 MCActivityButton能够在点击时显示一个动画效果,通常是一个旋转的活动指示器,这种动画通常用于向用户表明后台正在处理某些操作。这种类型的动画对于提升应用的交互质量和用户满意度非常有帮助,因为它能够让用户知道他们的操作没有被忽略,而是正在进行处理。 使用MCActivityButton时,开发者首先需要在项目中包含这个库。从提供的文件信息来看,可以使用CocoaPods作为依赖管理工具来安装MCActivityButton。在Podfile中添加`pod "MCActivityButton"`命令,并运行`pod install`来安装库。之后,开发者就可以在项目中导入MCActivityButton模块并开始使用。 创建MCActivityButton的实例非常简单,只需按照常规的方式创建一个UIButton实例,然后进行布局和初始化。之后,你可以自定义MCActivityButton,包括设置标题、背景色、边框样式等。当按钮被点击时,它会自动启动内置的动画效果。MCActivityButton提供了一种简单的方式来增强标准UIButton的功能,而不需要开发者编写额外的动画代码。 需要注意的是,MCActivityButton虽然功能强大,但文档说明该项目仍在开发中,并未经过彻底测试,因此使用时可能需要承担一定的风险。在开发关键业务应用时,开发者应该谨慎使用未经充分测试的第三方库。 最后,文件信息中提到的"播客文件"可能是指在开发过程中可以参考的一些视频教程或教学内容,而"压缩包子文件的文件名称列表: MCActivityButton-master"表明了项目文件的压缩包名称,通常这是一个版本控制仓库(如GitHub)的文件夹名称,其中包含了项目的源代码。开发者可以通过下载该压缩包来获取MCActivityButton的源代码,并在本地进行集成和测试。" 知识点总结: 1. MCActivityButton是一个Objective-C语言编写的UIButton子类。 2. 它提供了一种在按钮点击时显示自定义动画的功能。 3. 动画通常是一个标准的iOS活动指示器。 4. 应用MCActivityButton需要通过CocoaPods进行安装。 5. 开发者可以在项目中导入MCActivityButton模块并创建实例。 6. MCActivityButton的自定义包括设置标题、样式等。 7. 尽管MCActivityButton提供了强大的功能,但它仍然在开发中,使用时需注意潜在风险。 8. 开发者可以通过下载项目文件来获取源代码,并在本地测试和集成。 9. MCActivityButton是一个旨在增强UIButton动画表现力的第三方库,通过简单的集成即可实现复杂的动画效果,特别适用于需要提供用户反馈的交互场景。

为下列代码实现可暂停效果: import UIKit class ViewController: UIViewController { private let radarAnimation = "radarAnimation" private var animationLayer: CALayer? private var animationGroup: CAAnimationGroup? private var opBtn: UIButton! override func viewDidLoad() { super.viewDidLoad() let first = makeRadarAnimation(showRect: CGRect(x: 120, y: 100, width: 100, height: 100), isRound: true) view.layer.addSublayer(first) opBtn = UIButton(frame: CGRect(x: 100, y: 450, width: 80, height: 80)) opBtn.backgroundColor = UIColor.red opBtn.clipsToBounds = true opBtn.setTitle("Hsu", for: .normal) opBtn.layer.cornerRadius = 10 view.addSubview(opBtn) let second = makeRadarAnimation(showRect: opBtn.frame, isRound: false) view.layer.insertSublayer(second, below: opBtn.layer) } @IBAction func startAction(_ sender: UIButton) { animationLayer?.add(animationGroup!, forKey: radarAnimation) } @IBAction func stopAction(_ sender: UIButton) { animationLayer?.removeAnimation(forKey: radarAnimation) } private func makeRadarAnimation(showRect: CGRect, isRound: Bool) -> CALayer { // 1. 一个动态波 let shapeLayer = CAShapeLayer() shapeLayer.frame = showRect // showRect 最大内切圆 if isRound { shapeLayer.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: showRect.width, height: showRect.height)).cgPath } else { // 矩形 shapeLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: showRect.width, height: showRect.height), cornerRadius: 10).cgPath } shapeLayer.fillColor = UIColor.orange.cgColor // 默认初始颜色透明度 shapeLayer.opacity = 0.0 animationLayer = shapeLayer // 2. 需要重复的动态波,即创建副本 let replicator = CAReplicatorLayer() replicator.frame = shapeLayer.bounds replicator.instanceCount = 4 replicator.instanceDelay = 1.0 replicator.addSublayer(shapeLayer) // 3. 创建动画组 let opacityAnimation = CABasicAnimation(keyPath: "opacity") opacityAnimation.fromValue = NSNumber(floatLiteral: 1.0) // 开始透明度 opacityAnimation.toValue = NSNumber(floatLiteral: 0) // 结束时透明底 let scaleAnimation = CABasicAnimation(keyPath: "transform") if isRound { scaleAnimation.fromValue = NSValue.init(caTransform3D: CATransform3DScale(CATransform3DIdentity, 0, 0, 0)) // 缩放起始大小 } else { scaleAnimation.fromValue = NSValue.init(caTransform3D: CATransform3DScale(CATransform3DIdentity, 1.0, 1.0, 0)) // 缩放起始大小 } scaleAnimation.toValue = NSValue.init(caTransform3D: CATransform3DScale(CATransform3DIdentity, 1.5, 1.5, 0)) // 缩放结束大小 let animationGroup = CAAnimationGroup() animationGroup.animations = [opacityAnimation, scaleAnimation] animationGroup.duration = 3.0 // 动画执行时间 animationGroup.repeatCount = HUGE // 最大重复 animationGroup.autoreverses = false self.animationGroup = animationGroup shapeLayer.add(animationGroup, forKey: radarAnimation) return replicator } }

2023-06-03 上传