AMPopTip - 优雅的iOS动画提示框库

news/2025/10/13 23:12:30/文章来源:https://www.cnblogs.com/qife122/p/19139640

AMPopTip

AMPopTip 是一个优雅的动画弹出提示框,可以从指定框架弹出。您可以指定弹出方向以及指向其原点的箭头。颜色、边框半径和字体都可以轻松自定义。此弹出提示框可用于为您的 UI 提供微妙的提示,并提供有趣的引导弹窗。

功能特性

  • 多种弹出方向:支持上、下、左、右及无箭头居中显示
  • 高度可定制:轻松自定义颜色、边框半径、字体等外观属性
  • 流畅动画:提供平滑的显示和隐藏动画效果
  • 简单易用的API:几行代码即可实现复杂的提示效果
  • 自动布局适应:智能适应不同屏幕尺寸和方向
  • Swift编写:基于 Swift 的现代化实现,性能优异

安装指南

CocoaPods

Podfile 中添加:

pod 'AMPopTip'

然后运行:

pod install
open App.xcworkspace

Carthage

Cartfile 中添加:

github "andreamazz/AMPopTip"

然后运行:

carthage update

AMPopTip.framework 添加到项目中,并在代码中导入:

import AMPopTip

使用说明

基本用法

显示弹出提示非常简单:

let popTip = PopTip()
popTip.show(text: "嘿!看这里!", direction: .up, maxWidth: 200, in: view, from: someView.frame)

无箭头居中显示

popTip.show(text: "嘿!看这里!", direction: .none, maxWidth: 200, in: view, from: view.frame)

自定义外观

let popTip = PopTip()
popTip.bubbleColor = UIColor.blue
popTip.textColor = UIColor.white
popTip.cornerRadius = 10
popTip.font = UIFont.systemFont(ofSize: 14)
popTip.show(text: "自定义样式提示", direction: .down, maxWidth: 200, in: view, from: button.frame)

核心代码

以下是 AMPopTip 的核心实现代码:

// 主要显示方法
public func show(text: String, direction: PopTipDirection, maxWidth: CGFloat, in view: UIView, from frame: CGRect) {self.text = textself.direction = directionself.containerView = viewself.from = frame// 配置外观configureBubble()configureText()// 计算位置calculatePosition()// 添加动画addShowAnimation()
}
// 气泡配置
private func configureBubble() {bubbleView.backgroundColor = bubbleColorbubbleView.layer.cornerRadius = cornerRadiusbubbleView.layer.shadowColor = UIColor.black.cgColorbubbleView.layer.shadowOffset = CGSize(width: 0, height: 2)bubbleView.layer.shadowRadius = 3bubbleView.layer.shadowOpacity = 0.1
}
// 箭头绘制
private func drawArrow() {let arrowPath = UIBezierPath()switch direction {case .up:arrowPath.move(to: CGPoint(x: arrowPosition.x, y: arrowPosition.y))arrowPath.addLine(to: CGPoint(x: arrowPosition.x - arrowSize, y: arrowPosition.y + arrowSize))arrowPath.addLine(to: CGPoint(x: arrowPosition.x + arrowSize, y: arrowPosition.y + arrowSize))case .down:arrowPath.move(to: CGPoint(x: arrowPosition.x, y: arrowPosition.y))arrowPath.addLine(to: CGPoint(x: arrowPosition.x - arrowSize, y: arrowPosition.y - arrowSize))arrowPath.addLine(to: CGPoint(x: arrowPosition.x + arrowSize, y: arrowPosition.y - arrowSize))// 其他方向...}arrowPath.close()bubbleColor.setFill()arrowPath.fill()
}
// 显示动画
private func addShowAnimation() {transform = CGAffineTransform(scaleX: 0.1, y: 0.1)alpha = 0UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {self.transform = .identityself.alpha = 1})
}

AMPopTip 提供了完整的提示框解决方案,通过简洁的 API 和丰富的自定义选项,让开发者能够轻松创建专业的用户引导和界面提示效果。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

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

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

相关文章

2026年深度对比值得推荐的10个在线客服系统

1. 唯一客服—— 可独立部署的高性能客服系统源码唯一客服系统主要功能是,为网站或APP等提供在线即时聊天功能,可以方便客户与我们的客服人员进行实时沟通的。主要用户群体是中小互联网科技公司,有自己的开发产品,…

文件名中有空格比较烦人

我们已经造好了两个文件:" t.sh"和"t m p" $ " t.sh" "t m p" OK $ " t.sh t m p" # 首先找不到t.sh,其次就算找到,接收到的也是3个参数t, m, p不是一个"t…

十月总结

10.11 广二 T1:计数、容斥原理 有一个计数的做法,大致做法是在最后面的开头统计,然后要求后面不能出现,这样贡献就是唯一的,需要fail树上跑下来dfn这样 容斥原理就比较直接,加上序列中有一个开头的,减去有两个开…

20251013 之所思 - 人生如梦

20251013 之所思1. 前天老板约了一个会议,讨论log的录制,防止问题发生时无法录到现场的数据而反复要求实车同事去复现问题采集数据。当我发言时被另一个同事打断并说表达的不正确,当时很气愤,一是自己刚刚开始发言…

20232421 2024-2025-1 《网络与系统攻防技术》实验一实验报告

20232421 2024-2025-1 《网络与系统攻防技术》实验一实验报告 1.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序…

20232317 2025-2026-1《网络与系统攻防技术》实验一实验报告

1.实验内容 1.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 1.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 1.3注入一个自己制作的shellcode并运行这段sh…

实用指南:【每日一面】React Hooks闭包陷阱

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java 面试 - krt

1、ArrayList和LinkedList的区别 2、@Autowired和@Resource的主要区别1、ArrayList和LinkedList的区别 ArrayList:底层数据结构:ArrayList基于数组实现,元素在内存中连续存储,支持随机访问(时间复杂度为o(1));…

软工大三开学总结

在本学期我的目标是主要是在完成本学期的课程目标拿到奖学金的同时跟进考研。 在考虑过很多之后我个人还是觉得考研是我的选择,因为我从心底里觉得,我好不容易 上到这儿了一说是吧,怎么能就止步于此呢,再向上走走呢…

SpringBoot-day2(基于SpringBoot实现SSMP整合) - a

SpringBoot JC-3.基于SpringBoot实现SSMP整合 ​ 重头戏来了,SpringBoot之所以好用,就是它能方便快捷的整合其他技术,这一部分咱们就来聊聊一些技术的整合方式,通过这一章的学习,大家能够感受到SpringBoot到底有多…

给一个字符串数组,输出不同的部分

豆包给出代码/// <summary> /// 字符串差异提取工具类(仅使用原字符串字符) /// </summary> public static class StringDiffExtractor {/// <summary>/// 从字符串列表中提取差异部分,差异部分仅…

Java按顺序提取Word内容(文本+数学公式) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

连接 USB 设备

转载自:https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb本指南将演练使用 USB/IP 开源项目 usbipd-win 将 USB 设备连接到 WSL 2 上运行的 Linux 分发版所需的步骤。 在 Windows 计算机上配置 USB/IP 项目…

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO2025-10-13 22:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

# 20232429 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己制作的shellcode并运行这段shellcode。 …

muduo网络库事件驱动模型的实现与架构 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SpringBoot-day1(快速上手SpringBoot,SpringBoot简介,SpringBoot基础配置,属性配置,yaml文件) - a

SpringBoot 文档更新日志版本 更新日期 操作 描述v1.0 2021/11/14 A 基础篇前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程…

Chroma私有化:本地部署完整方案

嵌入向量(vector embedding)是表示任何类型数据的 A.I 原生方式,使它们非常适合与各种 A.I 驱动的工具和算法一起使用。 它们可以表示文本、图像,很快还可以表示音频和视频。 有许多创建嵌入的选项,无论是在本地…

嵌入式-C++面经2

一、问题总览cpp重载和重写的区别 cpp虚函数表 指针和引用的区别 linux的常用开发指令 linux编译运行程序的指令 关键字inline 什么场景使用内联 如何避免内存泄露 map和unordered_map 引用外部头文件双引号和尖括号的…

elk time

elk time- "/etc/localtime:/etc/localtime:ro"