SFSafariViewController PresentViewController 动画

swift

1个回答

写回答

836314614@qq.com

2025-09-01 02:20

+ 关注

IOS
IOS

使用SFSafariViewController PresentViewController动画

在开发IOS应用程序时,我们经常需要在应用中显示网页内容。为了实现这一功能,苹果提供了一个名为SFSafariViewController的类,它允许我们在应用中嵌入一个完整的Safari浏览器。

SFSafariViewController不仅可以在应用中显示网页,还提供了一些其他的功能,比如可以处理Cookies、自动填充表单和密码、支持AIrDrop和打印等。此外,它还提供了一个可自定义的用户界面,以适应应用的整体设计。

在使用SFSafariViewController时,我们可以选择使用不同的动画效果来呈现视图控制器。PresentViewController是一种常用的呈现方式,它会以动画的形式将SFSafariViewController从底部滑入屏幕

下面是一段案例代码,演示了如何使用SFSafariViewController PresentViewController动画:

Swift

import SafariServices

class ViewController: UIViewController {

@IBAction func showWebpage(_ sender: UIButton) {

if let url = URL(string: "https://www.example.com") {

let safariViewController = SFSafariViewController(url: url)

safariViewController.delegate = self

present(safariViewController, animated: true, completion: nil)

}

}

}

extension ViewController: SFSafariViewControllerDelegate {

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {

dismiss(animated: true, completion: nil)

}

}

在上面的代码中,我们首先创建了一个URL对象,它代表了我们要显示的网页的地址。然后,我们使用这个URL对象创建了一个SFSafariViewController实例。接下来,我们将safariViewController的delegate设置为当前视图控制器,并使用present方法将其呈现出来。

当用户完成浏览网页并点击Done按钮时,我们通过实现safariViewControllerDidFinish方法来处理完成事件。在这个方法中,我们调用dismiss方法将SFSafariViewController从屏幕上移除。

自定义SFSafariViewController PresentViewController动画

除了使用默认的PresentViewController动画外,我们还可以自定义SFSafariViewController的呈现动画效果。可以通过UIViewControllerTransitioningDelegate协议来实现这一点。

下面是一段案例代码,演示了如何自定义SFSafariViewController的PresentViewController动画:

Swift

import SafariServices

class ViewController: UIViewController {

@IBAction func showWebpage(_ sender: UIButton) {

if let url = URL(string: "https://www.example.com") {

let safariViewController = SFSafariViewController(url: url)

safariViewController.transitioningDelegate = self

safariViewController.modalPresentationStyle = .custom

present(safariViewController, animated: true, completion: nil)

}

}

}

extension ViewController: UIViewControllerTransitioningDelegate {

func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {

return CustomAnimationController()

}

}

class CustomAnimationController: NSObject, UIViewControllerAnimatedTransitioning {

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {

return 0.5

}

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

guard let fromVC = transitionContext.viewController(forKey: .from),

let toVC = transitionContext.viewController(forKey: .to),

let contAInerView = transitionContext.contAInerView else {

return

}

contAInerView.addSubview(toVC.view)

let duration = transitionDuration(using: transitionContext)

toVC.view.frame = CGRect(x: 0, y: contAInerView.bounds.height, width: contAInerView.bounds.width, height: contAInerView.bounds.height)

UIView.animate(withDuration: duration, animations: {

toVC.view.frame = contAInerView.bounds

}, completion: { _ in

transitionContext.completeTransition(!transitionContext.transitionWasCancelled)

})

}

}

在上面的代码中,我们首先创建了一个SFSafariViewController实例,并将其transitioningDelegate设置为当前视图控制器。然后,我们将modalPresentationStyle设置为.custom来启用自定义的呈现样式。

接下来,我们实现了UIViewControllerTransitioningDelegate协议中的animationController方法,返回了一个遵循UIViewControllerAnimatedTransitioning协议的自定义动画控制器CustomAnimationController实例。这个自定义动画控制器定义了我们希望实现的自定义动画效果。

在CustomAnimationController中,我们首先获取了fromVC、toVC和contAInerView等必要的视图控制器和视图。然后,我们将toVC的视图添加到contAInerView中,并设置了呈现动画的初始状态。

接下来,我们使用UIView的animate方法来执行呈现动画。在动画闭包中,我们将toVC的视图从底部滑入屏幕,最终完成呈现动画效果。在动画完成时,我们调用transitionContext的completeTransition方法来标记动画的完成状态。

通过自定义SFSafariViewController的PresentViewController动画,我们可以为应用程序提供更加个性化和独特的用户体验。无论是使用默认的动画效果还是自定义动画,SFSafariViewController都是一个强大而实用的工具,可以方便地在应用中展示网页内容。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号