ios SwiftUI列表中的UICalendarView未正确呈现

wz8daaqr  于 2023-02-10  发布在  iOS
关注(0)|答案(1)|浏览(251)
    • bounty将在3天后过期**。回答此问题可获得+50声望奖励。Damian Kociszewski希望引起更多人对此问题的关注:我需要你帮我把它修好

我在列表视图中显示UICalendarView时遇到了困难。无论我做什么,日历总是呈现在节边界之外(如下面的屏幕截图所示,最后一周被截断)。理想情况下,我希望日历呈现在节视图中,具有完全可用的宽度和高度,可以自行调整以适应所有内容。

下面是我的列表视图代码:

List {
        Section(header: Text("text")) {
            MyCalendarView()
                .scaledToFill() // .scaledToFit()
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                // .frame(width: 200)
                // .frame(height: 400)
        }
    }

下面是我的uikit日历视图代码:

let calendarView = UICalendarView()
        
        calendarView.translatesAutoresizingMaskIntoConstraints = false
        calendarView.calendar = Calendar(identifier: .iso8601)
        calendarView.tintColor = UIColor.tintColor
        
        view.addSubview(calendarView)
        
        NSLayoutConstraint.activate([
            calendarView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
            calendarView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0),
            calendarView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0),
            calendarView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0)
        ])

我使用的UIViewRepresentable如下所示:

struct MyCalendarView: UIViewControllerRepresentable {

  typealias UIViewControllerType = MyCalendarViewController

  func makeUIViewController(context: Context) -> MyCalendarViewController {
    let viewController = MyViewController()
    
    return viewController
  }

  func updateUIViewController(_ uiViewController: MyViewController, context: Context) {}
}

此外,我收到以下警告:

[UICalendarView] UICalendarView's height is smaller than it can render its content in; defaulting to the minimum height.
enxuqcxy

enxuqcxy1#

你的思路是正确的!UICalendarView有一个与其内容相关的固有大小。你可以了解更多关于here的概念。
要解决这个问题,你需要做的就是使用SwiftUI的fixedSize修饰符。下面的代码是在Swift Playgrounds中测试的。

struct MyCalendarView: UIViewRepresentable {

    func makeUIView(context: Context) -> UICalendarView {
        let calendarView = UICalendarView()
        calendarView.calendar = Calendar(identifier: .iso8601)
        calendarView.tintColor = UIColor.tintColor
        return calendarView
    }

    func updateUIView(_ uiView: UICalendarView, context: Context) {
    }
}

上面你可以看到我已经简化了你的UIViewRepresentable来包含你的日历视图的所有信息,你不需要NSLayoutConstraints或者translatesAutoresizingMaskIntoConstraints来达到你想要的效果。

List {
        Section(header: Text("text")) {
            MyCalendarView()
                .fixedSize(horizontal: false, vertical: true)
        }
    }

在上面的例子中,你的日历将被包含在节中,并且与它的内容垂直。这是因为fixedSize修饰符引用了UIViewRepresentable的 * 内在内容大小 *。水平固定大小将导致日历不在节中居中,所以我将该值设置为false。
我提供了输出的屏幕截图:

相关问题