Hero是一个用于构建iOS视图控制器转场的库。它在上层提供了一个基于UIKit繁琐的转场API的声明式层——使得自定义转场对开发者来说变得容易。
Hero类似于Keynote的魔法移动。它会检查所有源视图和目标视图上的heroID
属性。然后自动将每个匹配的视图对从其旧状态过渡到新状态。
Hero还可以为未匹配的视图构建动画。通过heroModifiers
属性定义这些动画很容易。Hero将与魔法移动动画同时运行这些动画。所有这些动画都可以通过用户手势进行**交互式控制**。
在视图控制器级别,Hero提供了几个模板过渡,您可以通过heroModalAnimationType
、heroNavigationAnimationType
和heroTabBarAnimationType
进行设置。这些可以用作您自定义过渡的基础。结合heroID
和heroModifiers
,您可以创建自己的独特过渡。
默认情况下,Hero根据Material Design 运动指南提供基于动态持续时间的设置。持续时间会自动根据距离和大小变化而确定,为您省去麻烦,同时提供一致和愉快的动画效果。
Hero不会对视图的构建或结构做出任何假设。在动画期间,它不会修改您的视图状态(除了隐藏它们)。这使得它适用于自动布局、程序布局、UICollectionView(不修改其布局对象)、UITableView、UINavigationController、UITabBarController等...
用法示例 1
视图控制器 1
redView.hero.id = "ironMan"
blackView.hero.id = "batMan"
视图控制器 2
self.hero.isEnabled = true
redView.hero.id = "ironMan"
blackView.hero.id = "batMan"
whiteView.hero.modifiers = [.translate(y:100)]
用法示例 2
视图控制器 1
greyView.hero.id = "skyWalker"
视图控制器 2
self.hero.isEnabled = true
greyView.hero.id = "skyWalker"
// collectionView is the parent view of all red cells
collectionView.hero.modifiers = [.cascade]
for cell in redCells {
cell.hero.modifiers = [.fade, .scale(0.5)]
}
你也可以在 故事板 中这样做!
安装
CocoaPods
在 Podfile 中添加以下条目
pod 'Hero'
然后运行 pod install
。
别忘了在你的每个想要使用 Hero 的文件中 import Hero
。
Carthage
向你的 Cartfile
添加以下条目
github "HeroTransitions/Hero"
然后运行 carthage update
。
如果你是第一次在项目中使用 Carthage,你需要按照Carthage 的说明执行一些额外的步骤。
Accio
在 Package.swift
中添加以下内容
.package(url: "https://github.com/HeroTransitions/Hero.git", .upToNextMajor(from: "1.4.0")),
接下来,像这样将 Hero
添加到你的 App targets 依赖项中
.target(
name: "App",
dependencies: [
"Hero",
]
),
然后运行 accio update
。
Swift 包管理器
要使用苹果的 Swift 包管理器进行集成,请将以下内容添加到 Package.swift
中作为依赖项
.package(url: "https://github.com/HeroTransitions/Hero.git", .upToNextMajor(from: "1.3.0"))
然后指定 Target 中希望使用 Hero 的依赖项。以下是一个示例 PackageDescription
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "MyPackage",
products: [
.library(
name: "MyPackage",
targets: ["MyPackage"]),
],
dependencies: [
.package(url: "https://github.com/HeroTransitions/Hero.git", .upToNextMajor(from: "1.6.1"))
],
targets: [
.target(
name: "MyPackage",1.6.1
dependencies: ["Hero"])
]
)
手动
- 将源文件夹拖到项目的任何位置。
文档
查看WIKI页面(使用说明)以获取文档。
对于最新版本,请查看header-doc。(在Xcode中使用 alt+点击)
交互式转换教程
常见问题解答
无法使用Hero转换,即使自我heroisenabled设置为true
如果您在导航控制器内部进行push/pop操作,请确保已在导航控制器上也启用了self.hero.isEnabled
。
在过渡过程中,被另一个匹配视图覆盖的视图
匹配的视图使用全局坐标空间,而未匹配的视图默认使用本地坐标空间。带有本地坐标空间的视图可能被其他使用全局坐标空间的视图覆盖。为了解决这个问题,请在被覆盖的视图中使用 useGlobalCoordinateSpace
修饰符。有关详细信息,请参阅坐标空间 Wiki 页面。
滑动动画与我的自定义动画同时显示
这是 Hero 提供的导航控制器默认动画。要禁用滑动动画,请在导航控制器中设置 self.hero.navigationAnimationType
为 .fade
或 .none
。
如何在使用不同默认动画进行关闭时
您可以使用动画类型 .selectBy(presenting:dismissing)
来指定不同默认的关闭动画。
例如
self.hero.modalAnimationType = .selectBy(presenting:.zoom, dismissing:.zoomOut)
贡献
我们欢迎任何贡献。请阅读贡献指南。