swift 长时间触摸后退按钮时禁用空矩形- NavigationBar

ax6ht2ek  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(49)

问题:当我按住导航栏后退按钮时,它显示一个空矩形。
需求:如何禁用此行为,但在同一时间,我想保持后退按钮的存在和功能,但没有长触摸显示这个矩形。
100d1x

的字符串
注意:我使用UIKit

ou6hu8tu

ou6hu8tu1#

这不是一个简单的矩形。这实际上是一个显示导航堆栈的菜单。如果你导航得更深,它会有更多的按钮。这不能用普通的API摆脱,但你可以用一些搅拌来解决它:
1.执行此操作:

private func swizzle(
    targetClass: AnyClass,
    originalSelector: Selector,
    swizzledSelector: Selector
) {
    let originalMethod = class_getInstanceMethod(targetClass, originalSelector)
    let swizzledMethod = class_getInstanceMethod(targetClass, swizzledSelector)
    method_exchangeImplementations(originalMethod!, swizzledMethod!)
}

extension UIViewController {
    static let classInit: Void = {
        let originalSelector = #selector(viewWillAppear(_:))
        let swizzledSelector = #selector(swizzledViewWillAppear(_:))
        swizzle(
            targetClass: UIViewController.self,
            originalSelector: originalSelector,
            swizzledSelector: swizzledSelector
        )
    }()

    @objc func swizzledViewWillAppear(_ animated: Bool) {
        if #available(iOS 14.0, *) {
            let backButton = BackBarButtonItem(title: "", style: .plain, target: nil, action: nil)
            navigationItem.backBarButtonItem = backButton
        }
        swizzledViewWillAppear(animated)
    }
}

class BackBarButtonItem: UIBarButtonItem {
    @available(iOS 14.0, *)
    override var menu: UIMenu? {
        get { super.menu }
        set { }
    }
}

字符串
1.在早期调用UIViewController.classInit(例如SwiftUI中的视图的init或UIKit中的视图控制器):

UIKit demo - AppDelegate

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        UIViewController.classInit
        return true
    }
}

SwiftUI演示

struct SomeView: View {
    init() {
        UIViewController.classInit
    }

    ,,,
}


关键是在导航初始化之前把它放在任何地方!
x1c 0d1x的数据

💡

除了上面的方法,你可以设置正确的导航标题名称onDisappear,使其按预期工作:

struct NavigationTesting: View {
    @State var title: LocalizedStringKey = " "

    var body: some View {
        NavigationStack {
            NavigationLink("Next") {
                Text("View 2")
            }
            .navigationTitle(title)
            .onDisappear { title = "Page 1" }
            .onAppear { title = " " }
        }
    }
}


这样你就可以用正确的名称填充菜单,并按预期隐藏“后退”标题。


相关问题