You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIViewControllerRepresentable与SwiftUI动态视图集成时对齐失效

问题概述

测试环境

  • iPhone 16 Pro(iOS 18.0 模拟器)
  • iPhone 6s(iOS 15.8.1 真机)

背景与封装代码

我有一个基于UIKit的UIPageViewController组件,将其封装为UIViewControllerRepresentable集成到SwiftUI项目中,封装代码如下:

import SwiftUI
import ZTronCarouselCore

internal struct PresetsCarousel: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UINavigationController {
        let navController = UINavigationController(
            rootViewController: Carousel16_9Page(
                    with: BasicMediaFactory(),
                    medias: [
                        ZTronImageDescriptor(assetName: "8.45.35"),
                        ZTronImageDescriptor(assetName: "9.35.30"),
                        ZTronImageDescriptor(assetName: "9.45.45"),
                        ZTronImageDescriptor(assetName: "11.25.35"),
                        ZTronImageDescriptor(assetName: "11.45.40"),
                        ZTronImageDescriptor(assetName: "12.25.45"),
                    ]
                )
        )
        
        navController.isNavigationBarHidden = true
        
        return navController
    }
    
    func updateUIViewController(_ uiViewController: UINavigationController, context: Context) { } 
}

问题场景1:添加尺寸约束后真机对齐失效

默认UIViewControllerRepresentable会占满所有可用空间,但该组件需要作为SwiftUI View的一部分(上下可能存在其他组件),因此我添加约束让它横竖屏切换时保持16:9宽高比,代码如下:

VStack(alignment: .leading) {
    if self.orientationInfo.orientation == .portrait {
        ScrollView(.horizontal) {
            HStack {
                ForEach(0..<7) { i in
                    VStack(alignment: .leading) {
                        Circle()
                            .fill(.red)
                            .frame(width: 75, height: 75)
                                    
                        Text("Lorem Ipsum")
                            .font(.caption)
                            .fontWeight(.medium)
                    }
                }
            }
        }
        .frame(maxHeight: 100)
    }

    PresetsCarousel()
        .aspectRatio(16.0/9.0, contentMode: .fit)
        .frame(maxWidth: .infinity)
                
        Text("Lorem Ipsum Dolorem Sit Amet")
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)

此设置在真机上出现对齐失效问题(模拟器无异常),效果如下:
Constrained UIViewControllerRepresentable loses alignment

问题场景2:无约束集成时模拟器尺寸异常

若仅使用无约束的集成方式:

VStack(alignment: .leading) {
    PresetsCarousel()
        .id("presets")
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)

模拟器中会出现尺寸异常,效果如下:
Unconstrained UIViewControllerRepresentable size

需求

我拥有该UIKit组件仓库的读写权限,求解决上述对齐失效问题的方案。

注:OrientationInfo对象参考Stack Overflow上的设备方向判断方案,通过.environmentObject(_:)注入页面。


内容的提问来源于stack exchange,提问作者Baffo rasta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:26:17