2017-01-01 14 views
0

Мне нужно запрограммировать тест для оптика. Поэтому им нужно, чтобы числа точно имели определенную высоту. У него есть IPad, и он передает его на телевизор. Я знаю, что я должен рассмотреть ИЦП телевизора. Вот мой код:показать точно Высота текста в TextField

func calcPoints() -> Float { 
    // he gives the Visus with a TextField 
    let visus = Float(textFieldVisus.text!) 
    // Here you put in the PPI of the device 
    let ppi = Float(textFieldDPI.text!) 
    // Calculate the lenght of the Number 
    let lenght = ((0.29 * 5)/visus!) * 5 
    // Calculate the Points (because TextFiels work with Points) 
    let points = ((ppi!/25.4) * lenght) * 0.75 
    // here you divide with 2 because you have a retina Display on the IPad 
    return (points/2) 
} 

func passeUIan() { 
    // Now i can give the Points to the TextField 
    textField1.bounds.size.width = CGFloat(calcPoints()) 
    textField1.bounds.size.height = CGFloat(calcPoints()) 
    textField1.font = UIFont(name: (textField1.font?.fontName)!, size: CGFloat(calcPoints())) 
} 

но когда я измеряю длину на телевизоре, это неправильно. Нормальный он должен быть 7,25 мм, но он составляет приблизительно 9 мм. Я не знаю, что не так. Я искал эту проблему начиная с 2 недель ...

+0

Настройки размера шрифта , не даст вам отображения чисел с правильной высотой. Вы должны знать внутренние размеры шрифта (например, его 'capHeight'), чтобы выбрать размер шрифта, который имеет правильную высоту. – matt

ответ

0

Для того, чтобы ознакомиться с руководством по работе с different font metrics, вам необходимо познакомиться. Размер шрифта обычно (но не всегда) является разницей между восходящим и десендерным. Для вашей цели высота заглавной буквы называется «высота крышки», а высота строчной буквы называется «высота x».

Нет формулы для перевода размера шрифта на высоту крышки или высоту x. Их отношения отличаются от шрифтов шрифтами и даже вариантами (жирным шрифтом, курсивом, маленькими шапками, дисплеем, книгой) внутри шрифта.

Функция ниже использовать бинарный поиск искать кегля, который соответствует вашей желаемой высоте (в дюймах):

// desiredHeight is in inches 
func pointSize(inFontName fontName: String, forDesiredCapHeight desiredHeight: CGFloat, ppi: CGFloat) -> CGFloat { 
    var minPointSize: CGFloat = 0 
    var maxPointSize: CGFloat = 5000 
    var pointSize = (minPointSize + maxPointSize)/2 

    // Finding for exact match may not be possible. UIFont may round off 
    // the sizes. If it's within 0.01 in (0.26 mm) of the desired height, 
    // we consider that good enough 
    let tolerance: CGFloat = 0.01 

    while let font = UIFont(name: fontName, size: pointSize) { 
     let actualHeight = font.capHeight/ppi * UIScreen.main.scale 

     if abs(actualHeight - desiredHeight) < tolerance { 
      return pointSize 
     } else if actualHeight < desiredHeight { 
      minPointSize = pointSize 
     } else { 
      maxPointSize = pointSize 
     } 

     pointSize = (minPointSize + maxPointSize)/2 
    } 

    return 0 
} 

Пример: найти размер точки, которые делают заглавную букву 1-дюймовой высокой в ​​Helvetica , (326 является PPI для iPhone 6/6S/7, который я использовал для тестирования):

let size = pointSize(inFontName: "Helvetica", forDesiredCapHeight: 1, ppi: 326) 
label.font = UIFont(name: fontName, size: size) 
label.text = "F" 

(советы: а UILabel ручки размера шрифта намного лучше, чем UITextField)

+0

Большое спасибо, это очень помогло мне! – Aionix

+0

Моя проблема заключалась в том, что я перешел с моего компьютера на свой телевизор. И поскольку мой телевизор больше, чем мой Mac, он масштабируется, поэтому я измеряю разницу и даю фактор Funktion. Так что теперь он благодарит вас за помощь! – Aionix