如何通过像素化纠正UIView和UILabel文本缩放?

时间:2017-10-10 02:26:54

标签: ios swift optimization uiview catextlayer

当我向UILabel添加带有文字的UIView,然后缩放UIView时,内容会显示为像素化。比例因子越大,像素化越大。

我知道使用CATextLayer可以提供帮助,并且可以显示缩放的UIViewUILabel文字而不会出现像素化但我不知道如何实现它。

这是我创建三角形并缩放它而没有像素化的方法。它具有完美的锋利边缘。

在缩放UILabel时如何确保相同?

func drawTriangle() {
    let path = UIBezierPath()
    path.moveToPoint(CGPoint(x: 0, y: 100))
    path.addLineToPoint(CGPoint(x: 100, y: 100))
    path.addLineToPoint(CGPoint(x: 50, y: 0))
    path.closePath()

    let shape = CAShapeLayer()
    shape.path = path.CGPath
    shape.fillColor = UIColor.blackColor().CGColor

    viewTriangle.layer.insertSublayer(shape, atIndex: 0)
}

func scaleTriangle() {
    viewTriangle.transform = CGAffineTransformMakeScale(5, 5)
}

问题:

在Swift代码中,如何将以下内容转换为使用CATextLayer,以便在没有像素化的情况下进行缩放?

问题代码:

func drawLetter() { // pixelated when scaled ?
    let labelLetter = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    labelLetter.text = "A"
    labelLetter.backgroundColor = UIColor.clearColor()
    labelLetter.textColor = UIColor.blackColor()
    labelLetter.font = UIFont(name: labelLetter.font.fontName, size: 144)
    labelLetter.textAlignment = .Center
    viewLetter.addSubview(labelLetter)
    }
}

func scaleView() {
    let scaleValue: CGFloat = 5
    self.viewLetter.transform = CGAffineTransformMakeScale(scaleValue, scaleValue)
}

图片:

enter image description here

2 个答案:

答案 0 :(得分:1)

  

我理解使用CATextLayer使用路径进行绘制,并且会显示缩放的UIView和UILabel文本而不会出现像素化。

你理解错了。 CATextLayer 绘制文本并缩放文本。这是一个或两件事:使用CATextLayer 一个UILabel。

在缩放视图中获取更多细节很容易:这就是视图PKEY_Devices_Status2的用途。只需增加它,考虑到屏幕分辨率导致的现有比例,以匹配您的比例变换。

答案 1 :(得分:1)

这会放大视图5倍并设置内容的缩放

func scaleView() {
    let scaleValue: CGFloat = 5
    self.viewLetter.transform = CGAffineTransformMakeScale(scaleValue, scaleValue)
    self.labelLetter.contentScaleFactor = scaleValue * x //scaleValue * native content scale  (2 on iPhone 8 and 3 on iPhone 8 plus)
}