1

我正在尝试适应UIToolbarUIViewRepresentableSwiftUI 中使用它。我需要支持 iOS 13,否则我会在 iOS 14 中使用 Apple 的新工具栏。

到目前为止,我有在屏幕上显示工具栏的代码,但是对于没有主页按钮的设备,它不会扩展到屏幕底部的安全区域。

有人对UIToolbarSwiftUI 中的完整实现有任何建议或参考吗?

图片:

https://i.stack.imgur.com/Weutp.png

我的代码:

// TestView.swift
var body: some View {
  VStack {
    Toolbar(items: [
      UIBarButtonItem(
         title: "Done",
         style: .plain,
         target: nil,
         action: nil
    ])
  }
}

// Toolbar.swift
import SwiftUI
import UIKit
import Foundation

struct Toolbar: UIViewRepresentable {
    typealias UIViewType = UIToolbar
    var items: [UIBarButtonItem]
    var toolbar: UIToolbar
    
    init(items: [UIBarButtonItem]) {
        self.toolbar = UIToolbar()
        self.items = items
    }

    func makeUIView(context: UIViewRepresentableContext<Toolbar>) -> UIToolbar {
        toolbar.setItems(self.items, animated: true)
        toolbar.barStyle = UIBarStyle.default
        toolbar.sizeToFit()
        return toolbar
    }
    
    func updateUIView(_ uiView: UIToolbar, context: UIViewRepresentableContext<Toolbar>) {
    }
    
    func makeCoordinator() -> Toolbar.Coordinator {
        Coordinator(self)
    }
    
    final class Coordinator: NSObject, UIToolbarDelegate, UIBarPositioning {
        var toolbar: Toolbar
        var barPosition: UIBarPosition
        
        init(_ toolbar: Toolbar) {
            self.toolbar = toolbar
            self.barPosition = .bottom
        }
        
        private func position(for: UIToolbar) -> UIBarPosition {
            return .bottom
        }
    }
}
4

1 回答 1

1

UIViewRepresentableSwiftUI 视图层次结构中的任何内容都只是一个视图,因此它应该由 SwiftUI 工具进行布局

这是固定部分(您的可表示内容没有变化)

使用 Xcode 11.4 / iOS 13.4 测试

演示

struct DemoToolbarView: View {
    var body: some View {
        VStack {
            Toolbar(items: [
                UIBarButtonItem(
                    title: "Done",
                    style: .plain,
                    target: nil,
                    action: nil)
            ])
        }.frame(maxHeight: .infinity, alignment: .bottom)
        .edgesIgnoringSafeArea(.bottom)
    }
}
于 2020-07-01T18:29:41.493 回答