Как исправить масштабирование текста 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)
}
Другие вопросы по тегам