标签: uiviewrepresentable

SwiftUI 不会使用 UIViewRepresentable 和 ObservableObject 刷新我的自定义 UIView

  1. 创建一个简单的 ARClass: ObservableObject with @Published var name: String
  2. 创建自定义 ARView:UIView 接收 ARClass 作为参数并从 ARClass.name 在中心绘制文本
  3. 创建 UIViewRepresentable

然后在 SwuftUI 视图中使用 ARClass(color: .red, name: "Test Text") 作为 SceneDelegate 中的 Environment 对象

class ARClass: ObservableObject {
@Published var bg: UIColor
@Published var name: String

init(color: UIColor, name: String) {
    self.bg = color
    self.name = name
}
Run Code Online (Sandbox Code Playgroud)

}

struct ARViewX: UIViewRepresentable {
var ar: ARClass
var frame: CGRect

func updateUIView(_ uiView: ARView, context: Context) {
    uiView.frame = frame
    uiView.ar = ar
    uiView.setNeedsDisplay()
} …
Run Code Online (Sandbox Code Playgroud)

swiftui uiviewrepresentable

6
推荐指数
1
解决办法
2769
查看次数

如何在 SwiftUI 中将 PKToolPicker 与 PKCanvasView 结合使用

目前,我可以在点击按钮时显示一个单独的PKCanvasView和 a 。PKToolPicker但是,该工具不会在选取器和画布视图之间传输。有谁知道如何链接两者,以便当我更改选择器中的工具时,该工具也会在画布视图中更新?我在下面附上了我的代码。谢谢你!

import SwiftUI
import PencilKit

struct DrawingView: View {
    @State private var showPicker = false
    @State private var canvasView = PKCanvasView()
    var body: some View {
        VStack {
            PencilKitView(isActive: $showPicker, canvasView: $canvasView)
            Button("Picker") { self.showPicker.toggle() }
        }
    }
}

struct PencilKitView: UIViewRepresentable {
    typealias UIViewType = PKCanvasView
    @Binding var isActive: Bool
    @Binding var canvasView: PKCanvasView

    let coordinator = Coordinator()
    
    class Coordinator: NSObject, PKToolPickerObserver {
        
        func toolPickerSelectedToolDidChange(_ toolPicker: PKToolPicker) {
            // some code
        }
        func …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui uiviewrepresentable pencilkit

6
推荐指数
1
解决办法
3096
查看次数

如何以编程方式从 UIViewRepresentable 触发 UIMenu

我尝试创建一个自定义 SwiftUI 菜单(基于UIMenu)。

但是,我无法触发主要操作。

当我点击时它会起作用CustomMenu,但不会触发程序操作。我究竟做错了什么?

struct CustomMenu: UIViewRepresentable {
    let title: String
    @Binding var isPresented: Bool

    func makeUIView(context: Context) -> UIButton {
        let button = UIButton(type: .system)
        button.setTitle(title, for: .normal)
        button.menu = UIMenu(title: "", options: .displayInline, children: [
            UIAction(title: "Item 1", image: UIImage(systemName: "mic"), handler: { _ in }),
            UIAction(title: "Item 2", image: UIImage(systemName: "envelope"), handler: { _ in }),
            UIAction(title: "Item 3", image: UIImage(systemName: "flame.fill"), handler: { _ in }),
            UIAction(title: "Item 4", …
Run Code Online (Sandbox Code Playgroud)

swift swiftui uiviewrepresentable uimenu

6
推荐指数
0
解决办法
2134
查看次数

SwiftUI UITextView 包装器如何调整其内容大小以匹配父级

我有这样的 UITextView 包装器,它可以工作,但是当我将它放在 List 行中时。我希望它自动调整大小,即在这种情况下具有与父级匹配的宽度 List Row VStack { },以及根据文本长度自动调整大小的高度。文本应该换行。现在它几乎可以工作了,但是像 URL 这样的较长文本超出了可用的行宽。

List {
VStack(alignment: .leading) {
     if self.hasNote {
        TextView(text: text)

     }
}
struct TextView: UIViewRepresentable {

    // MARK: - Properties
    let text: String

    init(text: String) {
        self.text = text
    }

    func makeUIView(context: Context) -> UITextView {

        let textView = UITextView()
        //textView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        textView.backgroundColor = UIColor.clear
        textView.isScrollEnabled = false
        textView.attributedText = self.attributedText
        textView.textContainer.lineBreakMode = .byWordWrapping
        //textView.layoutIfNeeded()
        textView.sizeToFit()
        return textView
    }

}
Run Code Online (Sandbox Code Playgroud)

更新

现在我有这样的东西,它确实适合父 SwiftUI 视图(列表中的行),但它不会包装文本(或根据内容大小垂直拉伸。如果滚动它会正确包装文本。另外,如果我设置 .frame(height: 500 …

uitextview swiftui uiviewrepresentable

5
推荐指数
0
解决办法
277
查看次数

我可以将 Snapchat SDK (SnapKit) 与 SwiftUI 结合使用吗?

我正在尝试将Snapkit与 iOS 应用程序集成,但我想使用 SwiftUI 而不是 UIKit。我已经使用 Snapkit 完成了所需的设置,现在我正在尝试让 Snapchat 登录按钮显示在我的应用程序中。我知道 Snapkit SDK 是为 UIKit 而不是 SwiftUI 制作的,但 SwiftUI 有一种方法可以使用 UIViewRepresentable 协议将 UIView 包装到 SwiftUI 中。我已经尝试实现此功能,但登录按钮仍然不显示。

\n\n

这是我的代码:

\n\n
import SwiftUI\nimport UIKit\nimport SCSDKLoginKit\n\nstruct ContentView: View {\n    var body: some View {\n        SnapchatLoginButtonView()\n    }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n    static var previews: some View {\n        ContentView()\n    }\n}\n\n\nstruct SnapchatLoginButtonView: UIViewRepresentable {\n\n    func makeCoordinator() -> Coordinator {\n        Coordinator()\n    }\n\n    func makeUIView(context: Context) -> SCSDKLoginButton {\n        let s = SCSDKLoginButton()\n        s.delegate = context.coordinator\n\n …
Run Code Online (Sandbox Code Playgroud)

snapchat swift swiftui uiviewrepresentable

5
推荐指数
1
解决办法
2408
查看次数

UIViewRepresentable 未更新与 ObservedObject 属性的绑定?

此视图是一个适应我的 SwiftUI 项目的 UIKit 滑块,因为在 SwiftUI 中Slider无法更改其轨道颜色,这可能是一个错误,因为您应该能够使用.accentColor.

不管怎样,这个滑块根据它的值改变它的轨道颜色,从绿色到红色。value如果绑定到普通属性,整个事情就完美地工作了(尽管我的渐变还不是很好)@State,但是当你尝试将它附加到它的属性时,@ObservedObject它就会中断,尽管轨道颜色仍然有效,但它永远不会改变基础价值。我想这只是一个错误,但更可能的是这里有一些东西需要修复。

struct RedscaleSlider: UIViewRepresentable {
    
    @Binding var value: Double
    
    var min: Double
    var max: Double
    
    class Coordinator: NSObject {
        @Binding var value: Double
        var min: Double
        var max: Double
        
        init(value: Binding<Double>, min: Double = 0, max: Double = 100) {
           _value = value
            self.min = min
            self.max = max
        }
        
        @objc func valueChanged(_ sender: UISlider) {
            self.value = Double(sender.value)
            sender.minimumTrackTintColor = green_to_red_gradient(value: (Double(sender.value) …
Run Code Online (Sandbox Code Playgroud)

swift swiftui uiviewrepresentable swiftui-14.2-defect

5
推荐指数
1
解决办法
4677
查看次数

嵌入 UIHostingController 中的 NavigationView 具有额外的安全区域插图

有人知道如何处理这个问题吗?似乎当您有一个带有 NavigationView 的 UIHostingController 时,会发生以下情况:

在此输入图像描述

注意大的灰色标签栏安全区域。

这主要是一个 UIKit 应用程序。我们正在用 swiftUI 视图替换选项卡栏中的一些选项卡。

这是我的代码:

var body: some View {
    NavigationView {
        ZStack {
            MapKitMapView(
                mapView: mapView,
                annotations: $annotations,
                polylines: $polylines,
                centerCoordinate: $centerCoordinate,
                newMapRegion: $newMapRegion,
                userTrackingMode: $userTrackingMode
            )
            .edgesIgnoringSafeArea(.all)
            .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
            
            ButtonLayer(mapView: mapView, userTrackingMode: $userTrackingMode, showSheet: $showSheet)
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .padding(.margin)
        }
        .edgesIgnoringSafeArea(.all)
        .navigationBarHidden(true)
        .sheet(isPresented: $showSheet) {
            SettingsView()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请原谅审查制度。我希望该应用程序保持匿名。

但本质上我的 UITabBar 是按如下方式构建的:

  • 有一个全局的 UINavigationViewController
  • UINavigationController 中的第一个也是唯一的项目是这个 UITabBar
  • UITabBar 选项卡都是以编程方式创建的。
  • 有问题的选项卡只是一个 UIHostingController,其中包含您在上面看到的 rootView 代码。

我尝试手动为 UIHostingController …

swift swiftui uihostingcontroller uiviewrepresentable

5
推荐指数
1
解决办法
3502
查看次数

SwiftUI UIViewRepresentable PDFKit PDFView AttributeGraph:通过属性检测到循环

编辑: 创建了一个示例项目来说明该问题:

https://github.com/Harold-D/PDFView_Representable

问题:

我迷失了,我在 SwiftUI 中对 PDFView 有一个非常简单的 UIViewRepresentable 包装器

import PDFKit
import SwiftUI

struct MyPDFView: UIViewRepresentable {
    typealias UIViewType = PDFView
    @Binding var pdf: Data

    func makeUIView(context _: UIViewRepresentableContext<MyPDFView>) -> UIViewType {
        return PDFView()
    }

    func updateUIView(_ pdfView: UIViewType, context _: UIViewRepresentableContext<MyPDFView>) {
        pdfView.document = PDFDocument(data: pdf)
    }
}
Run Code Online (Sandbox Code Playgroud)

它正确显示 PDF,但会生成大约 18 条AttributeGraph: cycle detected through attribute消息。

@Binding var pdfStruct: PDFStruct
var body: some View {
    MyPDFView(pdf: Binding($pdfStruct.pdf)!)
}
Run Code Online (Sandbox Code Playgroud)
struct PDFStruct {
    var pdf: Data?
} …
Run Code Online (Sandbox Code Playgroud)

pdfkit retain-cycle uiviewrepresentable

5
推荐指数
1
解决办法
346
查看次数

努力在 SwiftUI 中实现 PDFView

我正在尝试在 SwiftUI 视图中显示 PDF。

当尝试在这里实施其他解决方案时,我收到错误Missing arguments for parameters 'PDFName', 'DisplayName' in call

错误图像

我假设您使用 PDFView() 的方式在 iOS 15 中发生了变化;但我似乎找不到任何方法在 SwiftUI 或文档中使用它。

任何帮助将不胜感激。

提前谢谢了!

当前的实施尝试导致上述错误:

import SwiftUI
import PDFKit

struct PDFViewer: View {
    var url: URL
    
    var body: some View {
        PDFKitRepresentedView(url)
    }
}

struct PDFKitRepresentedView: UIViewRepresentable {
    let url: URL
    init(_ url: URL) {
        self.url = url
    }

    func makeUIView(context: UIViewRepresentableContext<PDFKitRepresentedView>) -> PDFKitRepresentedView.UIViewType {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: self.url)
        pdfView.autoScales = true
        return pdfView
    }

    func …
Run Code Online (Sandbox Code Playgroud)

pdfview ios swift swiftui uiviewrepresentable

5
推荐指数
0
解决办法
963
查看次数

如何使用 SwiftUI 实现带有 UIViewRepresentable 的延迟加载 ScrollView?

我正在尝试使用 UIViewRepresentable 实现延迟加载 MyLazyHStack 视图,但它不会延迟加载元素。我在 MyLazyHStack 的内容中使用 LazyHStack,但所有元素都是立即加载,而不是根据需要延迟加载。这是我的代码的一个最小示例。有人可以帮我弄清楚我做错了什么吗?

struct MyLazyHStack<Content: View>: UIViewRepresentable {
    var content: Content
    
    func makeUIView(context: Context) -> UIView {
        let scrollView = UIScrollView()
        scrollView.isPagingEnabled = true
        
        let hostingController = UIHostingController(rootView: content)
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        
        scrollView.addSubview(hostingController.view)
        
        NSLayoutConstraint.activate([
            hostingController.view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
            hostingController.view.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
            hostingController.view.topAnchor.constraint(equalTo: scrollView.topAnchor),
            hostingController.view.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
            hostingController.view.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
        ])
        
        return scrollView
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {}
}

struct ContentView: View {
    var body: some View {
        MyLazyHStack {
            LazyHStack {
                ForEach(1..<100) { index in
                    Text("Element \(index)") …
Run Code Online (Sandbox Code Playgroud)

lazy-loading swift swiftui uiviewrepresentable

5
推荐指数
0
解决办法
250
查看次数