2017-01-01 57 views
0

我必須爲眼鏡師編程查看測試。所以他們需要數字正好具有特定的高度。 他有一個IPad ans將它流式傳輸到電視機。我知道我必須考慮電視的PPI。這是我的代碼:在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高度」。

沒有公式可將字體大小轉換爲字體高度或字體高度。它們的關係不同,從字體到字體,甚至是變體(粗體,斜體,小寫字母,顯示,書本)。

下面的功能使用二進制搜索來尋找一個點的大小符合您的期望高度(英寸):

// 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英寸高的黑體。 (326是用於iPhone 6/6S/7的PPI,這是我用於測試):

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流式傳輸。而且由於我的電視比我的Mac更大,所以我測量了差異並給出了Funktion的因素。所以現在它的作品謝謝大家的幫助! – Aionix