测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可协议 | MIT |
发布上次发布 | 2017年10月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 hanshuai 维护。
AlertTransition 是一个可扩展的库,用于制作视图控制器转换,尤其是用于 alert 转换。
AlertTransition 是一个基类,创建基本结构,但没有实现默认动画。
EasyTransition 是 AlertTransition 的一个子类。有了它,您可以结合平移、缩放、旋转和 alpha 来自定义转换。您还可以使用自定义颜色或 UIBlurEffect 改变背景。它支持更改设备方向。它在使用代码或 storyboard 时都很容易使用。
![]() | ![]() | ![]() |
MenuTransition 是 AlertTransition 的一个子类。有了它,您可以用几行代码制作一个侧边菜单。
TrolleyTransition 是 AlertTransition 的一个子类。有了它,您可以用几行代码制作一个手推车。
您可以通过继承 AlertTransition 来编写自己的自定义转换。您还可以使用 AlertTransition 包装其他转换效果,如 BubbleTransition 或 StarWars.iOS。
![]() | ![]() |
使用 AlertTransition 非常简单
// First, initialize your presented controller
let alert = SomeController()
// Second, initialize a subclass of AlertTransition, such as EasyTransition, configure your controller with it
alert.at.transition = EasyTransition()
// Present your controller, Amazing!!
present(alert, animated: true, completion: nil)
如果您使用 storyboard
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// First, find presented controller
let controller = segue.destination
// Second, initialize a subclass of AlertTransition, such as EasyTransition, configure your controller with it
controller.at.transition = EasyTransition()
}
@IBAction func dismissButtonClicked() {
dismiss(animated: true, completion: nil)
}
如何设置显示控制器的框架?遵从 AlertFrameProtocol 或 自适配
遵从 AlertFrameProtocol,通过属性 alertFrame 提供您需要的框架
class SomeController: UIViewController, AlertFrameProtocol {
var alertFrame: CGRect {
let x = (UIScreen.main.bounds.size.width - 200) / 2
let y = (UIScreen.main.bounds.size.height - 250) / 2
return CGRect(x: x, y: y, width: 200, height: 250)
}
}
您需要一个不中断的约束链和视图(具有定义的高度)来填充控制器视图顶部边缘和底部边缘之间的区域,您还需要一个(具有定义的宽度)来填充控制器视图左侧边缘和右侧边缘之间的区域。如果您知道如何编写 自适配单元格,这将对您来说很容易。
AlertTransition 将计算视图的宽度和高度,并将显示的控制器设置在屏幕中心。
有时,可能会有约束冲突。在约束链中,选择一个约束并减少它的优先级(例如,从1000减少到999),一切都将正常。
您可以在 SnapKitAlertController.swift 和 Main.storyboard 中找到示例代码。
您可以使用 backgroundType 更改 alert 背景。效果 Gif 如上图第二张图片。
let alert = SomeController()
// It is a property of AlertTransition, you can use any subclass, just use EasyTransition as an example
let transition = EasyTransition()
transition.backgroundType = .blurEffect(style: .extraLight, alpha: 0.9)
// transition.backgroundType = .blurEffect(style: .light, alpha: 0.9)
// transition.backgroundType = .blurEffect(style: .dark, alpha: 0.9)
// transition.backgroundType = .color(UIColor.blue.withAlphaComponent(0.5))
alert.at.transition = transition
present(alert, animated: true, completion: nil)
您可以使用枚举 AnimationType 容易地组合您的自定义转换。
let alert = SomeController()
let transition = EasyTransition()
transition.startTransforms = [.rotation(angle: CGFloat(Double.pi/2), anchorPoint: CGPoint(x: 0, y: 0)), .alpha(0)]
alert.at.transition = transition
present(alert, animated: true, completion: nil)
EasyTransition 使用 startTransforms 和显示控制器视图的最终框架来计算初始状态。上述示例代码,视图将绕着左上角的锚点旋转 pi / 2,alpha 为 0。
还有一个名为 endTransforms 的属性,默认情况下其值与 startTransforms 相同。
您还可以使用
let alert = SomeController()
let transition = EasyTransition()
transition.presentAnimateParams.damping = 0.3
alert.at.transition = transition
present(alert, animated: true, completion: nil)
制作侧边菜单只需要三个步骤。设置框架和更改背景就像其他
class MainController: UIViewController {
// First, hold your menu controller in your main controller
var menuController = MenuController()
override func viewDidLoad() {
super.viewDidLoad()
// second, initialize MenuTransition with presenting controller
let transition = MenuTransition(from: navigationController)
// third, set MenuTransition to your menuController
menuController.at.transition = transition
}
}
当你选择侧边菜单中的一个项目时,你需要从主控制器推送到控制器。这样推送以制作合适的动画。
(self.at.transition as? MenuTransition)?.push(controller: NextViewController())
在大多数情况下,你只需要重写
public class TrolleyTransition: AlertTransition {
public override init(from controller: UIViewController?) {
super.init(from: controller)
duration = 0.5
}
public override func performPresentedTransition(presentingView: UIView, presentedView: UIView, context: UIViewControllerContextTransitioning) {
presentedView.frame.origin.y = UIScreen.main.bounds.height
UIView.animate(withDuration: duration/2, animations: {
presentingView.layer.transform = self.firstTransform()
}) { (complete) in
UIView.animate(withDuration: self.duration/2, animations: {
presentingView.layer.transform = self.secondTransform()
presentedView.transform = CGAffineTransform(translationX: 0, y: -presentedView.frame.height)
}, completion: { (complete) in
context.completeTransition(complete)
})
}
}
public override func performDismissedTransition(presentingView: UIView, presentedView: UIView, context: UIViewControllerContextTransitioning) {
UIView.animate(withDuration: duration/2, animations: {
presentedView.transform = CGAffineTransform.identity
presentingView.layer.transform = self.firstTransform()
}) { (complete) in
UIView.animate(withDuration: self.duration/2, animations: {
presentingView.layer.transform = CATransform3DIdentity
}, completion: { (complete) in
context.completeTransition(complete)
})
}
}
private func firstTransform() -> CATransform3D {
var form = CATransform3DIdentity
form.m34 = 1.0 / -900
form = CATransform3DScale(form, 0.9, 0.9, 1)
form = CATransform3DRotate(form, 15.0 * CGFloat(Double.pi)/180.0, 1, 0, 0)
form = CATransform3DTranslate(form, 0, 0, -100.0)
return form
}
private func secondTransform() -> CATransform3D {
var form = CATransform3DIdentity
form.m34 = firstTransform().m34
form = CATransform3DTranslate(form, 0, -20, 0)
form = CATransform3DScale(form, 0.9, 0.9, 1)
return form
}
}
如果你想添加UIPercentDrivenInteractiveTransition或自定义UIPresentationController,请在初始化方法中设置
public override init(from controller: UIViewController? = nil) {
super.init(from: controller)
interactionTransitionType = EasyPercentDrivenTransition.self
presentationControllerType = SomePresentationController.self
}
如果你编写了一个令人惊叹的自定义过渡,请提交一个pull请求。我们期待积累自定义过渡。并且通过AlertTransition,我们可以轻松地从一个自定义过渡切换到另一个。
,请随时
,即使你在README中发现了拼写错误,因为我英语不好。
,请
。
或需要帮助,请
,然后再提交一个问题。