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)
此设置在真机上出现对齐失效问题(模拟器无异常),效果如下:
问题场景2:无约束集成时模拟器尺寸异常
若仅使用无约束的集成方式:
VStack(alignment: .leading) { PresetsCarousel() .id("presets") } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
模拟器中会出现尺寸异常,效果如下:
需求
我拥有该UIKit组件仓库的读写权限,求解决上述对齐失效问题的方案。
注:OrientationInfo对象参考Stack Overflow上的设备方向判断方案,通过.environmentObject(_:)注入页面。
内容的提问来源于stack exchange,提问作者Baffo rasta
相关产品推荐
相关产品推荐

