Как исправить масштабирование текста UIView и UILabel с помощью пикселизации?
Когда я добавляю 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)
}
Образ:
2 ответа
Я понимаю, что использование CATextLayer использует пути для рисования и будет отображать масштабированный текст UIView и UILabel без пикселизации.
Вы неправильно поняли. CATextLayer рисует текст и масштабирует его текст. Это или-или вещь: используйте CATextLayer или UILabel.
Легко получить больше деталей в масштабированном виде: это то, что вид contentScaleFactor
для. Просто увеличьте его, принимая во внимание существующий масштаб из-за разрешения экрана, чтобы соответствовать преобразованию вашего масштаба.
Это увеличивает представление в 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)
}