首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当嵌入到SwiftUI中时,无法将SafeArea视图放置在UIHostingController之外

当嵌入到SwiftUI中时,无法将SafeArea视图放置在UIHostingController之外
EN

Stack Overflow用户
提问于 2021-11-29 14:27:01
回答 4查看 1.5K关注 0票数 6

我有一个简单的SwiftUI视图,包含3个文本元素:

代码语言:javascript
复制
struct ImageDescriptionView: View {
    var title: String?
    var imageDescription: String?
    var copyright: String?

    var body: some View {
        VStack(alignment: .leading) {
        
            if let title = title {
                Text(title)
                    .fontWeight(.bold)
                    .foregroundColor(.white)
                    .frame(maxWidth: .infinity, alignment: .leading)
            }
        
            if let imageDescription = imageDescription {
                Text(imageDescription)
                    .foregroundColor(.white)
                    .fontWeight(.medium)
                    .frame(maxWidth: .infinity, alignment: .leading)
            }
        
            if let copyright = copyright {
                Text(copyright)
                    .font(.body)
                    .foregroundColor(.white)
                    .frame(maxWidth: .infinity, alignment: .leading)
            }
        
        }
        .background(
            Color.blue
        )
    }
}

SwiftUI视图嵌入在UIHostingController

代码语言:javascript
复制
class ViewController: UIViewController {

    private var hostingController = UIHostingController(rootView: ImageDescriptionView(title: "25. November 2021", imageDescription: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", copyright: "Bild © Unknown"))

    override func viewDidLoad() {
        super.viewDidLoad()
        setUpHC()
    }

    private func setUpHC() {
        hostingController.view.backgroundColor = .red
    
        view.addSubview(hostingController.view)
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
        addChild(hostingController)
        hostingController.didMove(toParent: self)
    }

}

结果如下:

UIHostingController总是比视图大。而且,它将始终使SwiftUI视图尊重安全区(在我的情况下,我不想这样做)

我想要的样子:

(请不要评论家庭指示器的可用性,这里不是这样的)

UIHostingController有什么问题?我尝试将.edgesIgnoreSafeArea(.all)设置为ImageDescriptionView中的所有视图,但没有帮助。

EN

回答 4

Stack Overflow用户

发布于 2022-03-02 14:57:41

在UIHostingControllers属性上,尝试以下操作

代码语言:javascript
复制
viewController._disableSafeArea = true

这应该能起作用。

票数 8
EN

Stack Overflow用户

发布于 2022-07-28 02:26:11

得到了在这里讨论一下这里的细节

代码语言:javascript
复制
extension UIHostingController {
    convenience public init(rootView: Content, ignoreSafeArea: Bool) {
        self.init(rootView: rootView)
        
        if ignoreSafeArea {
            disableSafeArea()
        }
    }
    
    func disableSafeArea() {
        guard let viewClass = object_getClass(view) else { return }
        
        let viewSubclassName = String(cString: class_getName(viewClass)).appending("_IgnoreSafeArea")
        if let viewSubclass = NSClassFromString(viewSubclassName) {
            object_setClass(view, viewSubclass)
        }
        else {
            guard let viewClassNameUtf8 = (viewSubclassName as NSString).utf8String else { return }
            guard let viewSubclass = objc_allocateClassPair(viewClass, viewClassNameUtf8, 0) else { return }
            
            if let method = class_getInstanceMethod(UIView.self, #selector(getter: UIView.safeAreaInsets)) {
                let safeAreaInsets: @convention(block) (AnyObject) -> UIEdgeInsets = { _ in
                    return .zero
                }
                class_addMethod(viewSubclass, #selector(getter: UIView.safeAreaInsets), imp_implementationWithBlock(safeAreaInsets), method_getTypeEncoding(method))
            }
            
            objc_registerClassPair(viewSubclass)
            object_setClass(view, viewSubclass)
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2022-10-04 11:20:09

也发生在我身上。当我将我的视图与框架对齐时,它起作用了,但为了使它与自动收费器一起工作,我必须考虑安全区域的高度,才能使它与UIHostingController一起工作,尽管我不必用标准视图来这样做。

代码:

代码语言:javascript
复制
hostingVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: view.safeAreaInsets.bottom).isActive = true
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70156299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档