每次呈现时,视图控制器原点都会发生变化

Posted

技术标签:

【中文标题】每次呈现时,视图控制器原点都会发生变化【英文标题】:View controller origin changes every time it's presented 【发布时间】:2016-11-02 10:22:54 【问题描述】:

我的视图控制器应该是这样的:

有时是这样的:

我想在圆圈中显示一个视图控制器,但是,几乎每次显示圆圈中的视图控制器 (ResultViewController) 时,它的位置都不同,尽管它的属性根本没有改变。这是我的代码:

func openCircle(withCenter center: CGPoint, dataSource: ([Items], Int, String))
    self.addCircle(withCenter: center, dataSource: dataSource)


func addCircle(withCenter circleCenter: CGPoint, dataSource: ([Items], Int, String)) 

    let longerSide = fmax(view.frame.size.height, view.frame.size.width)
    let shorterSide = fmin(view.frame.size.height, view.frame.size.width)

    let circleRadius = longerSide / 2
    var resultViewOrigin = CGPoint()
    var resultViewSize = CGSize()

    if UIDevice.current.userInterfaceIdiom == .pad 

        let rectWidth = shorterSide / 2
        let rectHeight = sqrt(abs(circleRadius * circleRadius - rectWidth * rectWidth)) + view.frame.size.height - circleCenter.y
        resultViewSize = CGSize(width: rectWidth, height: rectHeight)
        resultViewOrigin = CGPoint(x: (view.frame.size.width - rectWidth) / 2, y: view.frame.size.height - rectHeight)

     else 
        resultViewOrigin = CGPoint(x: 0.0, y: 0.0)
        resultViewSize = CGSize(width: view.frame.size.width, height: view.frame.size.height)
    

    let resultViewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "ResultVC") as! ResultViewController
    resultViewController.transitioningDelegate = self
    resultViewController.modalPresentationStyle = .custom
    resultViewController.dataSource = dataSource
    resultViewController.view.frame = CGRect(origin: resultViewOrigin, size: resultViewSize)

    transition.circle = UIView()
    transition.startingPoint = circleCenter
    transition.radius = circleRadius
    transition.circle.frame = circleFrame(radius: transition.radius, center: transition.startingPoint)

    present(resultViewController, animated: true)

在 iPhone 上运行良好,在 iPad 上不行,有什么问题?

【问题讨论】:

您能否包含所需显示的屏幕截图? (来自 iPhone) @Danoram 抱歉回复晚了,请查看编辑 你能拍出更好的照片吗?我不明白有什么问题。并可能突出显示它们? @Honey 您是否注意到在第二个屏幕截图中,部分文本不在圆圈内?圆圈中有一个视图控制器,它应该在圆圈的范围内 也许它可以解决你的问题。设置 resultViewController 的框架后,您可以将其视图的中心设置为 resultViewController.view.center = self.view.center 【参考方案1】:

我发现了这个问题,实际上是Regular-Regular 尺寸类的缺失约束导致了这个问题,我通过在底部布局指南中添加一个间距来解决这个问题。

感谢大家的想法。

【讨论】:

【参考方案2】:

您可以使用 容器视图 而不是显示视图控制器。您可以通过编程方式或在界面构建器中创建它们(请参阅Apple docs)。

【讨论】:

我在呈现的视图控制器上附加了动画,容器视图对我来说不是最佳解决方案 容器视图是普通视图。您可以使用视图动画显示或隐藏它们。为什么它不适合您? 不仅仅是动画,还有很多数据和连接,从视图控制器到容器视图的迁移太高了 一个容器视图包含一个带有视图控制器的视图。

以上是关于每次呈现时,视图控制器原点都会发生变化的主要内容,如果未能解决你的问题,请参考以下文章

由于 rootviewcontroller 呈现新视图后导航栏颜色发生变化

呈现/关闭包含表格的模态视图控制器会使表格下降

从 AppDelegate 呈现特定的视图控制器

每当我尝试呈现以前的视图控制器时都会出现阴影

无法在视图中设置标签

页面控制器发生了变化,但 Carousel 没有 SwiftUI