动态分配的 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()
函数的视图上尝试了 setNeedsDisplay
和 setNeedsLayout
以及其他一些奇怪的事情。
@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 秒才能更新屏幕!
所以我得出结论,代码毕竟工作正常。
我有一个 UIView
和一个 UILabel
,我希望允许用户动态更改字体大小。下面的代码几乎可以工作,但问题是 将新的 UIFont
分配给标签后,它不会立即显示在 UI. 中,而是, 需要其他 UI activity 才能显示。
我正在寻找的是一种在手势结束后立即显示字体更改的技术。
从 this tutorial 中所示的技术开始,我向 UIScrollView
添加了一个手势识别器。在关联的 UIViewController
中,我实现了 handlePinch(UIpinchGestureRecognizer)
.
在那个函数中,我只在手势开始和结束时采取行动(不尝试动画)。如果用户指示缩放,我将字体增加 4 点。如果用户指示缩小,我将字体减小 4 磅。这一切都有效,除了屏幕不反映更改直到另一个 UI 函数被执行的事实。我只在模拟器上测试过这个,但我认为它在真实设备上是一样的。
我已经在 UILabel
以及传递给 handlePinch()
函数的视图上尝试了 setNeedsDisplay
和 setNeedsLayout
以及其他一些奇怪的事情。
@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 秒才能更新屏幕!
所以我得出结论,代码毕竟工作正常。