动态分配的 UIFont 不会在慢速模拟器中立即显示

Dynamically assigned UIFont does not show immediately in slow simulator

我有一个 UIView 和一个 UILabel,我希望允许用户动态更改字体大小。下面的代码几乎可以工作,但问题是 将新的 UIFont 分配给标签后,它不会立即显示在 UI. 中,而是, 需要其他 UI activity 才能显示。

我正在寻找的是一种在手势结束后立即显示字体更改的技术。

this tutorial 中所示的技术开始,我向 UIScrollView 添加了一个手势识别器。在关联的 UIViewController 中,我实现了 handlePinch(UIpinchGestureRecognizer).

在那个函数中,我只在手势开始和结束时采取行动(不尝试动画)。如果用户指示缩放,我将字体增加 4 点。如果用户指示缩小,我将字体减小 4 磅。这一切都有效,除了屏幕不反映更改直到另一个 UI 函数被执行的事实。我只在模拟器上测试过这个,但我认为它在真实设备上是一样的。

我已经在 UILabel 以及传递给 handlePinch() 函数的视图上尝试了 setNeedsDisplaysetNeedsLayout 以及其他一些奇怪的事情。

@IBAction func handlePinch(_ gesture: UIPinchGestureRecognizer) {
  guard let gestureView = gesture.view else {
    return;
  }

  gestureView.transform = gestureView.transform.scaledBy(x: gesture.scale, y: gesture.scale)

  if (gesture.state == UIPinchGestureRecognizer.State.began) {
    pinchD = gestureView.transform.d
    print("pinch started ", pinchD)
  }

  if (gesture.state == UIPinchGestureRecognizer.State.ended) {
    print("pinch ended ", gestureView.transform.d)
    print("compare:", pinchD, gestureView.transform.d)
    let larger = gestureView.transform.d > pinchD
    let fontSize = multiLineLabel.font.pointSize
    if (larger) {
      if (fontSize < 28) {
        let calculatedFont = UIFont(name: multiLineLabel.font.fontName, size: fontSize + 4)
        print("bigger fontSize", fontSize + 4);
        multiLineLabel.font = calculatedFont
      }
    } else {
      if (fontSize > 12) {
        let calculatedFont = UIFont(name: multiLineLabel.font.fontName, size: fontSize - 4)
        print("smaller fontSize", fontSize - 4);
        multiLineLabel.font = calculatedFont
      }
    }
  }
}

将 calculatedFont 应用于 UILabel 后需要做什么才能使其立即显示在应用程序中?

补充说明:

handlePinch() 按预期运行;每次捏合手势结束时,我都会看到 bigger fontSize...smaller fontSize... 已记录。

记录后,模拟器屏幕字体大小保持不变,直到我执行几项操作之一。导致字体大小改变的一件事是如果我滑动到下一个项目。在动画开始之前,字体会增加。如果我点击后退按钮,字体也会更改(字体更改会在另一个视图出现之前短暂显示)。

原来我的推测是错误的:

I have only tested this on the simulator, but I presume it would be the same on a real device.

我认为那是不正确的。

我正在一台非常非常旧的 iMac 上进行测试,模拟器停滞不前,需要 15 或 30 秒才能更新屏幕!

所以我得出结论,代码毕竟工作正常。