Swift仿微信语音通话最小化时后的效果实例代码
前言
最近碰到个需求,需要仿微信语音通话缩小化后,保持界面最上层有一个悬浮的小View可以一点击就把刚刚缩放掉的界面再放回来,其实本质就是创造了一个新的Window,在这个window上创建了一个rootController并展示他,缩小化时是把controllerdismiss掉了,再次点击那个小View之后把这个controller再展示出来便可以了。同理微信小程序其实也是在一个新的Window中做了一套新的逻辑。随着现在手机性能的提升,多Window同时存在并不会造成严重卡顿,而衍生出来的一种新的开发方式。
实例代码
上代码,这个是根据网上找到的类似效果进行了部分修改的,作者叫冯琦帆
SuspendTool
importFoundation
importUIKit
enumSuspendType{
casenone
casesingle
casemulti
}
classSuspendTool:NSObject{
staticletsharedInstance=SuspendTool()
privatevarsuspendWindows:[SuspendWindow]=[]
//varsemicircle:Semicircle?
varorigin:CGPoint=CGPoint.init(x:10,y:300)
staticfuncshowSuspendWindow(rootViewController:UIViewController,coverImageName:String){
lettool=SuspendTool.sharedInstance
letwindow=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)
}
staticfuncreplaceSuspendWindow(rootViewController:UIViewController,coverImageName:String){
lettool=SuspendTool.sharedInstance
tool.suspendWindows.removeAll()
letwindow=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)
}
staticfuncremove(suspendWindow:SuspendWindow){
UIView.animate(withDuration:0.25,animations:{
suspendWindow.alpha=0
}){(complete)in
ifletindex=SuspendTool.sharedInstance.suspendWindows.index(of:suspendWindow){
SuspendTool.sharedInstance.suspendWindows.remove(at:index)
}
}
}
staticfuncsetLatestOrigin(origin:CGPoint){
SuspendTool.sharedInstance.origin=origin
}
}
SuspendWindow
importUIKit
letradious:CGFloat=82
classSuspendWindow:UIWindow{
fileprivateletcoverImageName:String
fileprivateletspace:CGFloat=15
varcontainsRootViewController:UIViewController?
init(rootViewController:UIViewController,coverImageName:String,frame:CGRect){
self.coverImageName=coverImageName
super.init(frame:frame)
//self.rootViewController=rootViewController
self.containsRootViewController=rootViewController
}
requiredinit?(coderaDecoder:NSCoder){
fatalError("init(coder:)hasnotbeenimplemented")
}
funcshow(){
self.backgroundColor=UIColor.clear
self.windowLevel=UIWindow.Level.alert-1//UIWindowLevelAlert-1
self.screen=UIScreen.main
self.isHidden=false
letbgView=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)
letpanGesture=UIPanGestureRecognizer.init(target:self,action:#selector(didPan(_:)))
self.addGestureRecognizer(panGesture)
lettapGesture=UITapGestureRecognizer.init(target:self,action:#selector(didTap(_:)))
self.addGestureRecognizer(tapGesture)
}
@objcfileprivatefuncdidTap(_tapGesture:UITapGestureRecognizer){
SuspendTool.sharedInstance.origin=self.frame.origin
self.containsRootViewController?.spread(from:self.self.frame.origin)
SuspendTool.remove(suspendWindow:self)
}
@objcfileprivatefuncdidPan(_panGesture:UIPanGestureRecognizer){
letpoint=panGesture.translation(in:panGesture.view)
varoriginX=self.frame.origin.x+point.x
iforiginXUIScreen.main.bounds.width-radious-space{
originX=UIScreen.main.bounds.width-radious-space
}
varoriginY=self.frame.origin.y+point.y
iforiginYUIScreen.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)
ifpanGesture.state==UIGestureRecognizer.State.cancelled||panGesture.state==UIGestureRecognizer.State.ended||panGesture.state==UIGestureRecognizer.State.failed{
self.adjustFrameAfterPan()
}
panGesture.setTranslation(CGPoint.zero,in:self)
}
fileprivatefuncadjustFrameAfterPan(){
varoriginX:CGFloat=space
ifself.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)
}
}
lazyvartimeLabel:UILabel={
lettimeLabel=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)
returntimeLabel
}()
lazyvariconImageView:UIImageView={
leticonImageView=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
returniconImageView
}()
}
   
UIViewController+FF
importFoundation
importUIKit
extensionUIViewController{
funcsuspend(coverImageName:String,type:SuspendType){
iftype==.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)
iftype==.single{
SuspendTool.replaceSuspendWindow(rootViewController:self,coverImageName:coverImageName)
}else{
SuspendTool.showSuspendWindow(rootViewController:self,coverImageName:coverImageName)
}
}
}
funcspread(frompoint:CGPoint){
ifletisContain=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()
})
}
staticfunccurrentViewController()->UIViewController{
varrootViewController:UIViewController?=nil
forwindowinUIApplication.shared.windows{
if(window.rootViewController!=nil){
rootViewController=window.rootViewController
break
}
}
varviewController=rootViewController
while(true){
ifviewController?.presentedViewController!=nil{
viewController=viewController!.presentedViewController
}elseifviewController!.isKind(of:UINavigationController.self){
viewController=(viewControlleras!UINavigationController).visibleViewController
}elseifviewController!.isKind(of:UITabBarController.self){
viewController=(viewControlleras!UITabBarController).selectedViewController
}else{
break
}
}
returnviewController!
}
}
总结
到此这篇关于Swift仿微信语音通话最小化时后效果的文章就介绍到这了,更多相关Swift微信语音通话最小化内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
