将 UIButton 字体大小调整为宽度
Posted
技术标签:
【中文标题】将 UIButton 字体大小调整为宽度【英文标题】:Adjust UIButton font size to width 【发布时间】:2011-05-30 16:16:02 【问题描述】:我有以下代码:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);
[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];
[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];
问题是当文本中的字符串不长时,它显示正常(1-2位)。但是,当它很长(3++ 位)时,我只能看到一个红色按钮,里面没有文字。我该如何调整?
我不这么认为:
[button.titleLabel setAdjustsFontSizeToFitWidth:YES];
工作,对吧?
【问题讨论】:
它应该可以工作,或者Label.adjustsFontSizeToFitWidth = YES。 它由titleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
工作
【参考方案1】:
试试这个:
button.titleLabel?.numberOfLines = 1
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.lineBreakMode = .byClipping //<-- MAGIC LINE
我不知道为什么会这样,但确实如此:)
【讨论】:
谢谢,而 button.titleLabel.lineBreakMode = UILineBreakModeClip; @yunas 将 UILineBreakModeClip 替换为 NSLineBreakByClipping Nvm,刚刚把numberOfLines
改成了0【参考方案2】:
button.titleLabel.adjustsFontSizeToFitWidth = YES;
如果您使用自动布局并已对按钮的宽度设置了限制,则应自行完成。
其他选项(最小比例因子、行数等)仍可用于根据您的需要进一步定制,但不是必需的。
【讨论】:
【参考方案3】:EliBud 的回答不适用于 ios 8。 我找到了一个适用于 iOS 8 的解决方案。 以下是快速代码:
let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)
您可以使用 label?.lineBreakMode,因为我发现不同中断模式的结果会有所不同。
【讨论】:
.adjustsFontSizeToFitWidth = true - 我怎样才能对 NSTextField 和可调整大小的窗口做同样的事情? 在我看来,这与使用 Xcode IB 选择标签并将其设置为 Autoshrink minimum font scale to 0.01 相同 使用 NSTextField 时没有 AutoShrink 选项 UITextField 有一个自动缩小文本的选项,而 NSTextField 没有。所以我认为你需要手动调整字体以适应文本字段的宽度。【参考方案4】:Swift 4 扩展
extension UIButton
@IBInspectable var adjustFontSizeToWidth: Bool
get
return self.titleLabel?.adjustsFontSizeToFitWidth
set
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
self.titleLabel?.lineBreakMode = .byClipping;
self.titleLabel?.baselineAdjustment = .alignCenters
【讨论】:
你用标签做什么? 用于制作getter 你能更深入地描述一下你的意思吗? 我使用标记之类的标记来定义是否启用调整。 为什么不使用 self.titleLabel?.adjustsFontSizeToFitWidth ?你需要什么额外的东西?【参考方案5】:在最新的 swift 中,这似乎对我有用
button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
【讨论】:
【参考方案6】:基于此处其他答案的 iOS 10.3 解决方案:
button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.baselineAdjustment = .alignCenters
还没有人提到baselineAdjustment
;我需要它,因为在adjustsFontSizeToFitWidth
生效后按钮标签会垂直错位。 Apple 的baselineAdjustment
文档:
如果
adjustsFontSizeToFitWidth
属性设置为true
,则此 属性控制文本基线在情境中的行为 需要调整字体大小的地方。默认值为 这个属性是alignBaselines
。此属性仅在以下情况下有效numberOfLines
属性设置为1
。
FWIW,我永远无法让标签完全对齐。
【讨论】:
【参考方案7】:adjustsFontSizeToFitWidth
对我不起作用,直到我在 Interface Builder 中对我的按钮设置了宽度限制。
设置约束可以防止按钮变大,因此没有意识到它必须缩小文本。
【讨论】:
【参考方案8】:基于 Nik Kov 的回答:
import UIKit
extension UIButton
@IBInspectable var adjustFontSizeToWidth: Bool
get
return titleLabel!.adjustsFontSizeToFitWidth
set
titleLabel!.adjustsFontSizeToFitWidth = newValue
titleLabel!.lineBreakMode = .byClipping
【讨论】:
这行得通,但是字体大小减少了很多,比如从 17 到 12。当字符串变大时,有什么方法可以增加标题标签的宽度? @R.Mohan 当然,但这都是关于固定宽度的。只要让约束不固定,它就会增长。不要同时设置前导/尾随,也不要设置其中之一 >=【参考方案9】:在带有 Swift 5 的 iOS 13.1 中,我还必须提供 contentEdgeInsets
来调整填充。
extension UIButton
@IBInspectable var adjustFontSizeToWidth: Bool
get
return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
set
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
self.titleLabel?.lineBreakMode = .byClipping;
self.titleLabel?.baselineAdjustment = .alignCenters
self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
【讨论】:
【参考方案10】:Xamarin.iOS 解决方案
var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);
我最终设置了字体大小,以确保在系统调整大小以适应之前字体是“大”的。
【讨论】:
【参考方案11】:以下解决方案对我有用:
button.titleLabel?.adjustsFontForContentSizeCategory = true
开发者文档将这个属性解释为:
一个布尔值,指示对象是否自动更新 设备的内容大小类别更改时的字体。
【讨论】:
【参考方案12】:如果其他答案都没有帮助,请确保您设置了默认的故事板样式值,然后 adjustsFontSizeToFitWidth
应该可以工作。
【讨论】:
这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review以上是关于将 UIButton 字体大小调整为宽度的主要内容,如果未能解决你的问题,请参考以下文章