UITextView Fonts are blurring after UIScrollView Zoom IN

I have created a small project with UIScrollView, UIView, and UITextView
(hierarchy is also the same.) Then I have added UIFont to with size
14 to UITextView.
Since I want to enable zoom in/out feature for this, I have added
UIScrollViewDelegate to this controller and override viewForZooming
method.
Then zoom in/out things are working fine except one thing.
When I Zoom IN the screen, I can see Fonts which are inside the
UITextView is blurred. I want to keep the font quality according to zoom scale after zooming in the finish. So I override scrollViewDidEndZooming
and adjust the textView frame size it is not working.
After a google search, i found some answers, but I tried them but couldn't
find the solution and most of them are very old answers.
So I kindly request from you guys, please, help me to resolve this problem and I really appreciate your feedback and help. I have
attached my source code for your reference.

Code Block 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({$0.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))
}
}



Answered by Claude31 in 656684022
This is a very old post, it's objc, but it provides info on font blur when zooming.

https://stackoverflow.com/questions/13530413/how-to-resize-uilabel-text-after-zooming-uiscrollview-zoomable

Hope that will help.
Accepted Answer
This is a very old post, it's objc, but it provides info on font blur when zooming.

https://stackoverflow.com/questions/13530413/how-to-resize-uilabel-text-after-zooming-uiscrollview-zoomable

Hope that will help.
Thanks, @Claude for ur reply. but it is a different case. According to his issue, he needs to adjust the UILabel length after zoom it. Looks font is not blurring in that issue.

But he has point like
Code Block
messageLabel.contentScaleFactor=scale;

is used for avoid to font blurring.

But i also use it like
Code Block
uiTextView.contentScaleFactor = scale

it is not working for me. font is still blurring.

So I'm seeking a way of using UIScrollView and without redraw the objects (using default zoom in functionality).
Hopefully, someone can help me !!!!
Hey Guys,

Finally, I was able to fix the font blurring issue successfully.


We have to consider scale factor both UITextView and CALayer of the UIView.
We need to update scale factor subviews as well using recursion.

Code Block
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)
    }
  }


We should call the above two methods for UITextView in scrollViewDidEndZooming (which is inherited from UIScrollViewDelegate) method.

Code Block
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
    scaleView(view: textView, scale: scale)
    scaleLayer(layer: textView.layer, scale: scale)
  }

But for the zoom-out feature, please don't set scale value directly then quality will lose. So need to keep the threshold value,it should be calculated according to your usage.
UITextView Fonts are blurring after UIScrollView Zoom IN
 
 
Q