当我将带有文本的
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)
}
图片:
这会将视图放大 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)
}
我知道使用 CATextLayer 使用路径进行绘图,并将显示缩放后的 UIView 和 UILabel 文本,而不会出现像素化。
你理解错了。 CATextLayer 绘制文本并缩放其文本。这是一个非此即彼的事情:使用 CATextLayer or UILabel。
contentScaleFactor
的用途。只需增加它,考虑到由于屏幕分辨率而产生的现有比例,以匹配您的比例变换。
尝试使用
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)
}