AlertTransition 2.1.0

AlertTransition 2.1.0

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布上次发布2017年10月
SwiftSwift 版本3.0
SPM支持 SPM

hanshuai 维护。



  • 作者:
  • HanShuai

AlertTransition






AlertTransition 是一个可扩展的库,用于制作视图控制器转换,尤其是用于 alert 转换。

概览

AlertTransition 是一个基类,创建基本结构,但没有实现默认动画。

EasyTransitionAlertTransition 的一个子类。有了它,您可以结合平移、缩放、旋转和 alpha 来自定义转换。您还可以使用自定义颜色或 UIBlurEffect 改变背景。它支持更改设备方向。它在使用代码或 storyboard 时都很容易使用。

MenuTransitionAlertTransition 的一个子类。有了它,您可以用几行代码制作一个侧边菜单。

TrolleyTransitionAlertTransition 的一个子类。有了它,您可以用几行代码制作一个手推车。

您可以通过继承 AlertTransition 来编写自己的自定义转换。您还可以使用 AlertTransition 包装其他转换效果,如 BubbleTransitionStarWars.iOS

AlertTransition

使用方法

使用 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

遵从 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)

EasyTransition

您可以使用枚举 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())

编写自定义AlertTransition

在大多数情况下,你只需要重写方法。将你的动画应用到上,例如TrolleyTransition。

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中发现了拼写错误,因为我英语不好。

  • 如果你

    ,请

  • 如果你

    或需要帮助,请

    ,然后再提交一个问题。

安装