放大后 UITextView 字体模糊
UITextView Fonts are bluring after Zoom IN
我用 UIScrollView、UIView 和 UITextView 创建了一个小项目(层次结构也一样。)。 UIView 显示为红色,UITextView 显示为蓝色。然后我将大小为 14 的 UIFont 添加到 UITextView。
因为我想为此启用缩放 in/out 功能,我已将 UIScrollViewDelegate 添加到此控制器并覆盖 viewForZooming 方法。
然后 zoom in/out 除一件事外一切正常。
当我放大屏幕时,我可以看到 UITextView 中的字体是模糊的。我想在放大完成后根据缩放比例保持字体质量。所以我覆盖了 scrollViewDidEndZooming 并调整了它不起作用的 textView 框架大小。
google 搜索后我找到了一些答案,但我试过了但找不到解决方案,而且大多数都是非常古老的答案。
所以我恳请你们帮助我解决这个问题,我非常感谢你们的反馈和帮助。我附上了我的源代码和屏幕截图供您参考。
代码:
class ViewController: UIViewController {
var scrollView: UIScrollView!
var mainView: UIView!
var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView = UIScrollView(frame: .zero)
scrollView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(scrollView)
NSLayoutConstraint.activate([
scrollView.widthAnchor.constraint(equalTo: self.view.widthAnchor),
scrollView.heightAnchor.constraint(equalTo: self.view.heightAnchor),
])
mainView = UIView(frame: .zero)
mainView.translatesAutoresizingMaskIntoConstraints = false
mainView.backgroundColor = UIColor.red
scrollView.addSubview(mainView)
NSLayoutConstraint.activate([
mainView.widthAnchor.constraint(equalToConstant: 600),
mainView.heightAnchor.constraint(equalToConstant: 400),
mainView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),
mainView.centerYAnchor.constraint(equalTo: scrollView.centerYAnchor)
])
textView = UITextView(frame: .zero)
textView.translatesAutoresizingMaskIntoConstraints = false
textView.backgroundColor = UIColor.blue
textView.font = UIFont(name: "Thonburi", size: 14)
textView.text = "Hello World"
textView.textAlignment = .center
mainView.addSubview(textView)
NSLayoutConstraint.activate([
textView.widthAnchor.constraint(equalToConstant: 200),
textView.heightAnchor.constraint(equalToConstant: 40),
textView.centerXAnchor.constraint(equalTo: mainView.centerXAnchor),
textView.centerYAnchor.constraint(equalTo: mainView.centerYAnchor),
])
scrollView.pinchGestureRecognizer?.isEnabled = true
scrollView.maximumZoomScale = 12.0
scrollView.minimumZoomScale = 0.2
scrollView.delegate = self
}
}
extension ViewController: UIScrollViewDelegate {
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
if let viewForZoom = scrollView.subviews.filter({[=10=].tag == 1}).first {
return viewForZoom
} else {
return scrollView.subviews.first
}
}
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
self.textView.frame = CGRect(origin: textView.frame.origin, size: CGSize(width: textView.frame.width*scale, height: textView.frame.height*scale))
}
}
没有缩放,只是正常的屏幕尺寸
放大后字体模糊
最后,我能够使用 contentScale 解决这个问题,它应该是更新 UIView 和 UIView 的图层以及特定 UIView 的子视图和子图层。否则,它将无法正常工作。
func scaleView( view: UIView, scale: CGFloat ){
view.contentScaleFactor = scale
for vi in view.subviews {
scaleView(view: vi, scale: scale)
}
}
func scaleLayer( layer: CALayer, scale: CGFloat ){
layer.contentsScale = scale
if layer.sublayers == nil {
return
}
for la in layer.sublayers! {
scaleLayer(layer: la, scale: scale)
}
}
我们应该在scrollViewDidEndZooming(继承自UIScrollViewDelegate)方法中为UITextView调用以上两个方法
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
scaleView(view: textView, scale: scale)
scaleLayer(layer: textView.layer, scale: scale)
}
但是对于缩小功能,请不要直接设置比例值,否则质量会下降。所以需要保留阈值,应该根据你的使用情况来计算。
我用 UIScrollView、UIView 和 UITextView 创建了一个小项目(层次结构也一样。)。 UIView 显示为红色,UITextView 显示为蓝色。然后我将大小为 14 的 UIFont 添加到 UITextView。
因为我想为此启用缩放 in/out 功能,我已将 UIScrollViewDelegate 添加到此控制器并覆盖 viewForZooming 方法。 然后 zoom in/out 除一件事外一切正常。
当我放大屏幕时,我可以看到 UITextView 中的字体是模糊的。我想在放大完成后根据缩放比例保持字体质量。所以我覆盖了 scrollViewDidEndZooming 并调整了它不起作用的 textView 框架大小。 google 搜索后我找到了一些答案,但我试过了但找不到解决方案,而且大多数都是非常古老的答案。
所以我恳请你们帮助我解决这个问题,我非常感谢你们的反馈和帮助。我附上了我的源代码和屏幕截图供您参考。
代码:
class ViewController: UIViewController {
var scrollView: UIScrollView!
var mainView: UIView!
var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView = UIScrollView(frame: .zero)
scrollView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(scrollView)
NSLayoutConstraint.activate([
scrollView.widthAnchor.constraint(equalTo: self.view.widthAnchor),
scrollView.heightAnchor.constraint(equalTo: self.view.heightAnchor),
])
mainView = UIView(frame: .zero)
mainView.translatesAutoresizingMaskIntoConstraints = false
mainView.backgroundColor = UIColor.red
scrollView.addSubview(mainView)
NSLayoutConstraint.activate([
mainView.widthAnchor.constraint(equalToConstant: 600),
mainView.heightAnchor.constraint(equalToConstant: 400),
mainView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),
mainView.centerYAnchor.constraint(equalTo: scrollView.centerYAnchor)
])
textView = UITextView(frame: .zero)
textView.translatesAutoresizingMaskIntoConstraints = false
textView.backgroundColor = UIColor.blue
textView.font = UIFont(name: "Thonburi", size: 14)
textView.text = "Hello World"
textView.textAlignment = .center
mainView.addSubview(textView)
NSLayoutConstraint.activate([
textView.widthAnchor.constraint(equalToConstant: 200),
textView.heightAnchor.constraint(equalToConstant: 40),
textView.centerXAnchor.constraint(equalTo: mainView.centerXAnchor),
textView.centerYAnchor.constraint(equalTo: mainView.centerYAnchor),
])
scrollView.pinchGestureRecognizer?.isEnabled = true
scrollView.maximumZoomScale = 12.0
scrollView.minimumZoomScale = 0.2
scrollView.delegate = self
}
}
extension ViewController: UIScrollViewDelegate {
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
if let viewForZoom = scrollView.subviews.filter({[=10=].tag == 1}).first {
return viewForZoom
} else {
return scrollView.subviews.first
}
}
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
self.textView.frame = CGRect(origin: textView.frame.origin, size: CGSize(width: textView.frame.width*scale, height: textView.frame.height*scale))
}
}
没有缩放,只是正常的屏幕尺寸
放大后字体模糊
最后,我能够使用 contentScale 解决这个问题,它应该是更新 UIView 和 UIView 的图层以及特定 UIView 的子视图和子图层。否则,它将无法正常工作。
func scaleView( view: UIView, scale: CGFloat ){
view.contentScaleFactor = scale
for vi in view.subviews {
scaleView(view: vi, scale: scale)
}
}
func scaleLayer( layer: CALayer, scale: CGFloat ){
layer.contentsScale = scale
if layer.sublayers == nil {
return
}
for la in layer.sublayers! {
scaleLayer(layer: la, scale: scale)
}
}
我们应该在scrollViewDidEndZooming(继承自UIScrollViewDelegate)方法中为UITextView调用以上两个方法
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
scaleView(view: textView, scale: scale)
scaleLayer(layer: textView.layer, scale: scale)
}
但是对于缩小功能,请不要直接设置比例值,否则质量会下降。所以需要保留阈值,应该根据你的使用情况来计算。