【问题标题】:UIKit: How can i resize a Viewcontroller to fit splitview primary column?UIKit:如何调整 Viewcontroller 的大小以适应 splitview 主列?
【发布时间】:2021-10-03 12:55:04
【问题描述】:

在我的 UIKit 应用程序中,我使用 UISplitViewController() 作为我的 rootViewController。我在我的SceneDelegate 中这样配置它:

var splitView: UISplitViewController?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    self.makeSplitViewController()
    
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = self.splitView
        self.window = window
        window.makeKeyAndVisible()

        self.splitView?.viewController(for: .secondary)?.navigationController?.navigationBar.barStyle = .black
    }
}

func makeSplitViewController() {
    let splitViewController = UISplitViewController(style: .doubleColumn)
    splitViewController.preferredDisplayMode = .oneBesideSecondary
    
    let primaryViewController = UINavigationController(rootViewController: CalendarViewController())
    let secondaryViewController = UIHostingController(rootView: EventDetailView())
    
    splitViewController.setViewController(primaryViewController, for: .primary)
    splitViewController.setViewController(secondaryViewController, for: .secondary)
    splitViewController.setViewController(primaryViewController, for: .compact)
    
    self.splitView = splitViewController
}

如您所见,我使用 CalendarViewController(包裹在 UINavigationController 中)作为我的 primaryViewController,而对于辅助视图,我使用包裹在 UIHostingController 中的 SwiftUI 视图

结果如下:

如您所见,CalendarViewController 适合 iPhone 屏幕,但不适合 iPad 主列。 CalendarViewController 来自 CalendarKit,一个 Swift 日历库。

我需要在 CalendarViewController 中进行哪些更改以适应 SplitView 主列?有什么想法吗?

参考:CalendarViewController

【问题讨论】:

  • 我猜这是由于尺寸等级。在 iPad 上,默认(阅读:全屏)根 VC 始终将是“常规”,而在 iPhone 上,它可能在纵向模式下是“紧凑”。我的第一个想法是检验我的假设——你试过在分屏中使用你的 iPad 吗?这应该清楚事情不是你想要的。接下来,我推荐(归因于@matt)biteinteractive.com/split-view-controllers-done-right-in-ios-14,他向我展示了如何最好让我的拆分VC成为根。它给你更多的灵活性,期间。
  • @dfd 感谢您的回答。在分屏中,它看起来像这样:i.stack.imgur.com/SwTiF.png 供参考:github.com/richardtop/CalendarKit/issues/…
  • 关于尺寸等级,我可能需要更具体一些。 UISplitViewController“服从”它显示的尺寸等级 - 我认为 - iOS 13。请记住,您正在 (a) 使用 iPad,(b) 使用某些版本的 iPadOS [您没有 说],和 (c) 目前你的两个屏幕截图显示“主要/次要”[我认为],我将在“iPad”[iPad mini? iPad pro 12.9 英寸?,还有别的吗?] 很难真正复制。更多,请记住,问题的一部分使用了一个 Apple 应用程序 [Calendar] ......???
  • @dfd 抱歉,我正在使用带有 iPadOS 15 的 11 英寸 iPad Pro。如果我创建了一个 repo,对你有帮助吗?如果我创建它,你能看一下吗?
  • @dfd 我还发现了这个:hacknicity.medium.com/…

标签: swift uikit uisplitviewcontroller calendarkit


【解决方案1】:

对于所有同样面临问题的人:经过一些尝试和错误,我找到了解决布局问题的解决方案。就我而言,关键是将视图布局从frame 更改为autolayout,如下所示:

dayHeaderView.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor).isActive = true
dayHeaderView.trailingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.trailingAnchor).isActive = true
dayHeaderView.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor).isActive = true
dayHeaderView.heightAnchor.constraint(equalToConstant: headerHeight).isActive = true

您可以在此处找到更多信息:

iOS 14 UISplitViewController: 5 Issues That You May Run Into

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多