swiftui视图uiview

发布于 2025-01-21 21:35:48 字数 1864 浏览 3 评论 0原文

我试图在Uiview的内部注入SwiftUi视图,它显示了我的SwiftUi视图,但是框架已经远了,我无法弄清楚原因。

更新:解散视图控制器并再次重新加载后,SwiftUI视图被完美地加载/显示,为什么?

这是我的swiftui视图:

@available(iOS 14.0, *)
struct AvailablePointsSummary: View {
    
    @State private var points: PointsResponse? = nil
    
    var body: some View {
        if let points = points {
            GroupBox(
                label:  SummaryLabelView(labelText: "Available Points")
            ) {
                SummaryRow(title: "Cash Points", amount: Float(points.cashoutPoints).withCommas())
                SummaryRow(title: "Promo Points", amount: Float(points.availablePromoPoints ?? 0).withCommas())
            }
            .frame(width: 380, height: 160)
        } else {
            Text("Loading...")
                .onAppear {
                    getPoints()
                }
        }

    }
    
    func getPoints() {
        PointsService().getPointsResponse { points in
            DispatchQueue.main.async {
                self.points = points
            }
        }
    }
    
}

@available(iOS 14.0, *)
var availPointsSummary = UIHostingController(rootView: AvailablePointsSummary())

我的uiviewController中的设置

func setupAvailablePoints(){
        let pointView = availPointsSummary.view
        pointView?.translatesAutoresizingMaskIntoConstraints = false
        pointView?.frame = CGRect(x: 0, y: 0, width: 380, height: 160)
        
        self.availPointsView.addSubview(pointView!)
        self.addChild(availPointsSummary)
    }

”在此处输入图像描述”

和结果

I am trying to inject a SwiftUI view inside of a UIView, and it is showing my SwiftUI view but the frame is way off and I cannot figure out why.

UPDATE: After dismissing the view controller and reloading it again, the SwiftUI view is loaded/presented perfectly, why is that?

This is my SwiftUI View:

@available(iOS 14.0, *)
struct AvailablePointsSummary: View {
    
    @State private var points: PointsResponse? = nil
    
    var body: some View {
        if let points = points {
            GroupBox(
                label:  SummaryLabelView(labelText: "Available Points")
            ) {
                SummaryRow(title: "Cash Points", amount: Float(points.cashoutPoints).withCommas())
                SummaryRow(title: "Promo Points", amount: Float(points.availablePromoPoints ?? 0).withCommas())
            }
            .frame(width: 380, height: 160)
        } else {
            Text("Loading...")
                .onAppear {
                    getPoints()
                }
        }

    }
    
    func getPoints() {
        PointsService().getPointsResponse { points in
            DispatchQueue.main.async {
                self.points = points
            }
        }
    }
    
}

@available(iOS 14.0, *)
var availPointsSummary = UIHostingController(rootView: AvailablePointsSummary())

Setup in my UIViewController

func setupAvailablePoints(){
        let pointView = availPointsSummary.view
        pointView?.translatesAutoresizingMaskIntoConstraints = false
        pointView?.frame = CGRect(x: 0, y: 0, width: 380, height: 160)
        
        self.availPointsView.addSubview(pointView!)
        self.addChild(availPointsSummary)
    }

enter image description here

And the result
enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

游魂 2025-01-28 21:35:48

尝试解决此问题的多个选项:-)

尝试layoutifneed在添加hostingController的视图之后

,或

尝试在view> view wwilllayoutsubviews或Overlide loadView中设置帧

尝试启用启用启用operage loadViews 自动大小面具

pointView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

添加以下约束

NSLayoutConstraint.activate([
    pointView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    pointView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    pointView.heightAnchor.constraint(equalToConstant:380),
    pointView.widthAnchor.constraint(equalToConstant:160)
])

Multiple options to try to fix this issue :-)

try layoutIfNeeded after adding hostingcontroller' view to superview

Or

try to set frames inside viewWillLayoutSubviews or override loadView to setup frame

Or

try enabling auto-sizing masks

pointView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

Or

add below constraints

NSLayoutConstraint.activate([
    pointView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    pointView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    pointView.heightAnchor.constraint(equalToConstant:380),
    pointView.widthAnchor.constraint(equalToConstant:160)
])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文