找到UIButton调整后的字体大小值?

时间:2017-02-11 12:51:57

标签: swift uibutton

我有方形按钮,无论是否在iPad或iPhone上显示,其大小都会有所不同。 我希望按钮标题的字体可以调整为按钮的大小,即。这样他们在较大的iPad屏幕上看起来不会太小,或者在较小的iPhone屏幕上看起来太大。

我提出了以下解决方案:

// Buttons is an outlet collection
for button in Buttons {
            button.titleLabel?.adjustsFontSizeToFitWidth = true
            button.titleEdgeInsets = UIEdgeInsetsMake(button.frame.height/3, button.frame.width/3, button.frame.height/3, button.frame.width/3)
            button.titleLabel!.numberOfLines = 1
            button.titleLabel!.minimumScaleFactor = 0.1
            button.clipsToBounds = true
            button.titleLabel?.baselineAdjustment = UIBaselineAdjustment.alignCenters

            print(button.titleLabel!.font.pointSize)


        }

这可以根据标题的宽度调整字体大小。因此,标题较短的按钮比标题较长的按钮具有更大的字体。

我想要所有按钮的字体大小相同,所以我想访问其中一个按钮的调整大小(让我们说最小的)将其设置为所有按钮。我怎么能这样做?

或者我想将字体调整为按钮高度而不是宽度,但无法找到有效的解决方案。

3 个答案:

答案 0 :(得分:1)

这是我在swift 4中的解决方案:

private func adjustedFontSizeOf(label: UILabel) -> CGFloat {
    guard let textSize = label.text?.size(withAttributes: [.font: label.font]), textSize.width > label.bounds.width else {
        return label.font.pointSize
    }

    let scale = label.bounds.width / textSize.width
    let actualFontSize = scale * label.font.pointSize

    return actualFontSize
}

希望它有所帮助。

答案 1 :(得分:0)

这是一个将所有按钮的字体大小设置为最小尺寸(其中)的解决方案。

第1步。我已经初步化了一些新按钮,用于测试:

<table>
  <tr>
    <td class="line1">line 1</td>
    <td class="line1">line 1</td>
    <td class="line1">line 1</td>
    <td class="line1">line 1</td>
    <td class="line2">line 2</td>
    <td class="line3">line 3</td>
  </tr>
</table>

第2步。然后,我添加了一个名为let button = UIButton() button.titleLabel!.font = UIFont(name: "Helvetica", size: 20) let button2 = UIButton() button2.titleLabel!.font = UIFont(name: "Helvetica", size: 16) let button3 = UIButton() button3.titleLabel!.font = UIFont(name: "Helvetica", size: 19) let Buttons = [button, button2, button3] 的变量,并且我使用大于几乎任何可能的按钮字体大小100的值初始化它,如下所示:

min

第3步。之后,我在循环中添加了更多代码:

var min = CGFloat(Int.max)

因此您的代码将如下所示:

for btn in Buttons{
  // here goes your code for your buttons(the code from the question)
  // then my code:
    if (btn.titleLabel?.font.pointSize)! < min{
        min = (btn.titleLabel?.font.pointSize)! // to get the minimum font size of any of the buttons 
    }
}

print(min) // prints 16, which is correct amongst the value [20,19,16] 

第4步。将所有按钮的字体大小设置为for btn in Buttons{ btn.titleLabel?.adjustsFontSizeToFitWidth = true btn.titleEdgeInsets = UIEdgeInsetsMake(btn.frame.height/3, btn.frame.width/3, btn.frame.height/3, btn.frame.width/3) btn.titleLabel!.numberOfLines = 1 btn.titleLabel!.minimumScaleFactor = 0.1 btn.clipsToBounds = true btn.titleLabel?.baselineAdjustment = UIBaselineAdjustment.alignCenters print(btn.titleLabel!.font.pointSize) if (btn.titleLabel?.font.pointSize)! < min{ min = (btn.titleLabel?.font.pointSize)! // to get the minimum font size of any of the buttons } }

min

Buttons.map { $0.titleLabel?.font = UIFont(name:($0.titleLabel?.font.fontName)! , size: min) }

如果你的最小字体大小是...... 15 ,那么所有按钮的字体大小将变为 15

就是这样。希望它有所帮助!

答案 2 :(得分:0)

这与 Swift 5 对我有用,希望对您有所帮助。

func adjustedFontSizeOf(label: UILabel, sizeBounds: CGSize) -> CGFloat {
    
    // return the real pointSize for a label with adjustsFontSizeToFitWidth activated
    // sizeBounds is the frame size where the label is enclosed (UIButton frame or similar)
    // because label.frame or label.bounds is always CGRect.zero
    
    let textSize = label.intrinsicContentSize
    
    var actualFontSize = label.font.pointSize
    if textSize.width > sizeBounds.width { // otherwise is not adjusted
        let scale = sizeBounds.width / textSize.width
        actualFontSize = scale * label.font.pointSize
    }

    return actualFontSize
}

func setButtonsToTheSameFontSize(buttons: [UIButton], maxPointSize: CGFloat)
{
    // set a list of buttons whose titleLabels have adjustFontSizeToFitWidth activated
    // to the same font pointSize using the minimum size among them
    
    var fsize: CGFloat = maxPointSize
    for b in buttons {
        let f = adjustedFontSizeOf(label: b.titleLabel!, sizeBounds: b.frame.size)
        if f < fsize { fsize = f }
    }
    for b in buttons { b.titleLabel?.font = b.titleLabel?.font.withSize(fsize) }
}