「SwiftUI」页面自定义右滑关闭

隐藏NavigationBarBackButton时,实现右滑关闭页面

引言:现在的大多数iOS App都有右滑关闭页面的功能,众多iPhone用户也都习惯了这种操作

当使用系统自带的NavigationBarBackButton时可以很轻松实现这个功能,但系统自带的BackButton通常会带上个页面的Title,并且需求通常需要自定义NavigationBar,就需要隐藏系统自带的返回摁钮,这时右滑返回的功能也消失了,这非常头疼

1.先看使用系统返回摁钮时操作

代码:

swift 复制代码
import SwiftUI

//父页面
struct IndexView: View {
    var body: some View {
        NavigationView{
            VStack {
                NavigationLink {
                    ChildView()
                } label: {
                    Text("jump to ChileView")
                }
            }
            .navigationBarTitle("首页", displayMode: .inline)
        }
       
        
    }
}
//子页面
struct ChildView: View {
    var body: some View {
        VStack {
            Text("ChildView")
        }
        .navigationBarTitle("子页面", displayMode: .inline)
    }
        
}
ps:可以发现子页面的返回摁钮会显示父页面的title,这通常是不符合页面UI的需求,但此时是可以满足右滑跳转的
2.当隐藏掉返回Button时操作

代码:

swift 复制代码
import SwiftUI

//父页面
struct IndexView: View {
    var body: some View {
        NavigationView{
            VStack {
                NavigationLink {
                    ChildView()
                } label: {
                    Text("jump to ChileView")
                }
            }
            .navigationBarTitle("首页", displayMode: .inline)
        }
       
        
    }
}
//子页面
struct ChildView: View {
    @Environment(\.presentationMode) var presentionation  //点了确定后 让本页面关闭消失的变量
    var body: some View {
        VStack {
            Text("ChildView")
        }
        .navigationBarTitle("子页面", displayMode: .inline)
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(
           leading:
            Button(action: {
                self.presentionation.wrappedValue.dismiss()
            }, label: {
                Image(systemName: "chevron.left")
                    .foregroundColor(Color.black)
            })
        )
    }
        
}
ps:这时我们可以满足UI的需求和设计,但是右滑返回的功能跟着BackButton一起隐藏掉了,这时功能就出现了缺失

3.这时候只需要给UINavigationController添加额外的代理和方法即可实现

新增代理代码:

swift 复制代码
import SwiftUI

//右滑返回
extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}
原代码不变:
swift 复制代码
import SwiftUI

//父页面
struct IndexView: View {
    var body: some View {
        NavigationView{
            VStack {
                NavigationLink {
                    ChildView()
                } label: {
                    Text("jump to ChileView")
                }
            }
            .navigationBarTitle("首页", displayMode: .inline)
        }
       
        
    }
}
//子页面
struct ChildView: View {
    @Environment(\.presentationMode) var presentionation  //点了确定后 让本页面关闭消失的变量
    var body: some View {
        VStack {
            Text("ChildView")
        }
        .navigationBarTitle("子页面", displayMode: .inline)
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(
           leading:
            Button(action: {
                self.presentionation.wrappedValue.dismiss()
            }, label: {
                Image(systemName: "chevron.left")
                    .foregroundColor(Color.black)
            })
        )
    }
        
}
添加上这个extension后UINavigationControl就可以实现右滑返回,返回通过NavigationLink跳转到当前页面的上一个页面(fullScreenCover无法跳转返回),所以添加上这个代理就可以实现右滑返回并且能够满足UI页面设计
相关推荐
东坡肘子2 天前
肘子的 Swift 周报 #063|异种肾脏移植取得突破
swiftui·swift·apple
恋猫de小郭2 天前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
靴子学长3 天前
iOS + watchOS Tourism App(含源码可简单复现)
mysql·ios·swiftui
hxx2219 天前
iOS swift开发系列--如何给swiftui内容视图添加背景图片显示
ios·swiftui·swift
胖虎110 天前
SwiftUI - (十九)组合视图
ios·swiftui·swift·组合视图
davidson147110 天前
Xcode
ios·swiftui·xcode·swift·apple
大熊猫侯佩11 天前
苹果开发者入门:修复 SwiftUI 中“跑偏的”动画(下)
swiftui·动画·animation·transition·转场·显式隐式动画·布局坐标
_rufeng_16 天前
SwiftUI入门篇
ios·swiftui·swift
大熊猫侯佩19 天前
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
list·swiftui·form·列表·navigation·导航·picker
袁代码1 个月前
SwiftUI开发教程系列 - 第十二章:本地化与多语言支持
开发语言·前端·ios·swiftui·swift·ios开发