文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用Swift怎么实现一个最小化语音通话功能

2023-06-06 17:53

关注

本篇文章为大家展示了使用Swift怎么实现一个最小化语音通话功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

SuspendTool

import Foundationimport UIKitenum SuspendType { case none case single case multi}class SuspendTool: NSObject { static let sharedInstance = SuspendTool() private var suspendWindows: [SuspendWindow] = []// var semicircle: Semicircle? var origin: CGPoint = CGPoint.init(x: 10, y: 300) static func showSuspendWindow(rootViewController: UIViewController, coverImageName: String) { let tool = SuspendTool.sharedInstance let window = SuspendWindow.init(rootViewController: rootViewController, coverImageName: coverImageName, frame: CGRect.init(origin: tool.origin, size: CGSize.init(width: radious, height: radious))) window.show() tool.suspendWindows.append(window) } static func replaceSuspendWindow(rootViewController: UIViewController, coverImageName: String) { let tool = SuspendTool.sharedInstance tool.suspendWindows.removeAll() let window = SuspendWindow.init(rootViewController: rootViewController, coverImageName: coverImageName, frame: CGRect.init(origin: tool.origin, size: CGSize.init(width: radious, height: radious))) window.show() tool.suspendWindows.append(window) } static func remove(suspendWindow: SuspendWindow) { UIView.animate(withDuration: 0.25, animations: {  suspendWindow.alpha = 0 }) { (complete) in  if let index = SuspendTool.sharedInstance.suspendWindows.index(of: suspendWindow) {  SuspendTool.sharedInstance.suspendWindows.remove(at: index)  } } } static func setLatestOrigin(origin: CGPoint) { SuspendTool.sharedInstance.origin = origin }}

SuspendWindow

import UIKitlet radious: CGFloat = 82class SuspendWindow: UIWindow {  fileprivate let coverImageName: String fileprivate let space: CGFloat = 15 var containsRootViewController: UIViewController?  init(rootViewController: UIViewController ,coverImageName: String, frame: CGRect) {  self.coverImageName = coverImageName  super.init(frame: frame)  // self.rootViewController = rootViewController  self.containsRootViewController = rootViewController }  required init?(coder aDecoder: NSCoder) {  fatalError("init(coder:) has not been implemented") }  func show() {  self.backgroundColor = UIColor.clear  self.windowLevel = UIWindow.Level.alert - 1//UIWindowLevelAlert - 1  self.screen = UIScreen.main  self.isHidden = false    let bgView = UIView()  bgView.isUserInteractionEnabled = true  bgView.frame = self.bounds  bgView.backgroundColor = UIColor.white  bgView.layer.cornerRadius = radious / 2.0  bgView.layer.borderColor = UIColor.lightGray.cgColor  bgView.layer.borderWidth = 5  bgView.layer.masksToBounds = true  self.addSubview(bgView)  bgView.addSubview(iconImageView)  bgView.addSubview(timeLabel)    let panGesture = UIPanGestureRecognizer.init(target: self, action: #selector(didPan(_:)))  self.addGestureRecognizer(panGesture)    let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(didTap(_:)))  self.addGestureRecognizer(tapGesture) }  @objc fileprivate func didTap(_ tapGesture: UITapGestureRecognizer) {  SuspendTool.sharedInstance.origin = self.frame.origin  self.containsRootViewController?.spread(from: self.self.frame.origin)  SuspendTool.remove(suspendWindow: self) }  @objc fileprivate func didPan(_ panGesture: UIPanGestureRecognizer) {  let point = panGesture.translation(in: panGesture.view)  var originX = self.frame.origin.x + point.x  if originX < space {   originX = space  } else if originX > UIScreen.main.bounds.width - radious - space {   originX = UIScreen.main.bounds.width - radious - space  }  var originY = self.frame.origin.y + point.y  if originY < space {   originY = space  } else if originY > UIScreen.main.bounds.height - radious - space {   originY = UIScreen.main.bounds.height - radious - space  }  self.frame = CGRect.init(x: originX, y: originY, width: self.bounds.width, height: self.bounds.height)  if panGesture.state == UIGestureRecognizer.State.cancelled || panGesture.state == UIGestureRecognizer.State.ended || panGesture.state == UIGestureRecognizer.State.failed {   self.adjustFrameAfterPan()  }  panGesture.setTranslation(CGPoint.zero, in: self) }  fileprivate func adjustFrameAfterPan() {  var originX: CGFloat = space  if self.center.x < UIScreen.main.bounds.width / 2 {   originX = space  } else if self.center.x >= UIScreen.main.bounds.width / 2 {   originX = UIScreen.main.bounds.width - radious - space  }  UIView.animate(withDuration: 0.25, animations: {   self.frame = CGRect.init(x: originX, y: self.frame.origin.y, width: self.frame.size.width, height: self.frame.size.height)  }) { (complete) in   SuspendTool.setLatestOrigin(origin: self.frame.origin)  } } lazy var timeLabel: UILabel = {  let timeLabel = UILabel()  timeLabel.frame = CGRect(x: 0, y: 55.5, width: 42, height: 13)  timeLabel.center.x = self.bounds.size.width / 2  timeLabel.textAlignment = .center  timeLabel.text = "0:00"  timeLabel.textColor = UIColor.text  timeLabel.font = UIFont.mediumFont(ofSize: 13)  return timeLabel }()  lazy var iconImageView: UIImageView = {  let iconImageView = UIImageView.init(image: UIImage.init(named: coverImageName))  iconImageView.isUserInteractionEnabled = true  iconImageView.frame = CGRect(x: 0, y: 12, width: 38, height: 38)  iconImageView.center.x = self.bounds.size.width / 2  return iconImageView }()}

UIViewController+FF

import Foundationimport UIKitextension UIViewController { func suspend(coverImageName: String, type: SuspendType) { if type == .none {  self.navigationController?.popViewController(animated: true)  return } self.view.layer.masksToBounds = true UIView.animate(withDuration: 0.25, animations: {  self.view.layer.cornerRadius = radious / 2.0  self.view.frame = CGRect.init(origin: SuspendTool.sharedInstance.origin, size: CGSize.init(width: radious, height: radious))  self.view.layoutIfNeeded() }) { (complete) in  self.navigationController?.popViewController(animated: false)  if type == .single {  SuspendTool.replaceSuspendWindow(rootViewController: self, coverImageName: coverImageName)  } else {  SuspendTool.showSuspendWindow(rootViewController: self, coverImageName: coverImageName)  } } } func spread(from point: CGPoint) { if let isContain = self.navigationController?.viewControllers.contains(self), isContain {  return } self.view.frame = CGRect.init(origin: point, size: CGSize.init(width: radious, height: radious)) //UIViewController.currentViewController()  UIViewController.currentViewController().navigationController?.pushViewController(self, animated: false) UIView.animate(withDuration: 0.25, animations: {  self.view.layer.cornerRadius = 0  self.view.frame = UIScreen.main.bounds  self.view.layoutIfNeeded() }) } static func currentViewController() -> UIViewController { var rootViewController: UIViewController? = nil for window in UIApplication.shared.windows {  if (window.rootViewController != nil) {  rootViewController = window.rootViewController  break  } } var viewController = rootViewController while (true) {  if viewController?.presentedViewController != nil {  viewController = viewController!.presentedViewController  } else if viewController!.isKind(of: UINavigationController.self) {  viewController = (viewController as! UINavigationController).visibleViewController  } else if viewController!.isKind(of: UITabBarController.self) {  viewController = (viewController as! UITabBarController).selectedViewController  } else {  break  } } return viewController! }}

上述内容就是使用Swift怎么实现一个最小化语音通话功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯