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

问题描述 投票:0回答:3

当我将带有文本的

UILabel
添加到
UIView
然后缩放
UIView
时,内容会以像素化方式显示。比例因子越大,像素化越大。

我知道使用

CATextLayer
可能能够提供帮助,并且可以显示缩放的
UIView
UILabel
文本而无需像素化,但我不知道如何实现它。

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

缩放时如何确保相同

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

ios swift optimization uiview catextlayer
3个回答
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)
}

0
投票

我知道使用 CATextLayer 使用路径进行绘图,并将显示缩放后的 UIView 和 UILabel 文本,而不会出现像素化。

你理解错了。 CATextLayer 绘制文本并缩放文本。这是一个非此即彼的事情:使用 CATextLayer or UILabel。

在缩放视图中很容易获得更多细节:这就是视图

contentScaleFactor
的用途。只需增加它,考虑到由于屏幕分辨率而产生的现有比例,以匹配您的比例变换。


0
投票

尝试使用

CGAffineTransformMakeScale(_:_:)
代替
CGAffineTransform(scaleX:y:)

之前

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

之后

    func scaleView() {
        let scaleValue: CGFloat = 5
        self.viewLetter.transform = CGAffineTransform(scaleX: scaleValue, y: scaleValue)
    }
© www.soinside.com 2019 - 2024. All rights reserved.