我正在努力使文本适合UILabel。我希望UILabel的宽度是恒定的,但我希望更改文本的字体大小,以便所有文本都能够适合标签。我基本上是用文本项创建一个菜单栏:今天,明天,本周,下周。 这是我的标签设置:
.header a {
float: left; /* new line */
}
我通过此功能具有特定的宽度,高度尺寸:
class MenuCell: BaseCell {
let dateLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.backgroundColor = UIColor(red: 247/255, green: 199/255, blue: 199/255, alpha: 1)
label.sizeToFit()
label.textAlignment = .center
label.adjustsFontForContentSizeCategory = true
label.allowsDefaultTighteningForTruncation = true
label.numberOfLines = 2
label.lineBreakMode = NSLineBreakMode.byTruncatingTail
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 10/UIFont.labelFontSize
return label
}()
我设置了这些单元格:
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: frame.width / 4, height: frame.height)
}
最终,我将单元格添加到视图中,
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as! MenuCell
cell.dateLabel.text = labelnames[indexPath.item]
cell.backgroundColor = UIColor(red: 247/255, green: 199/255, blue: 199/255, alpha: 1)
return cell
}
我将整个视图放在导航栏正下方的其他视图控制器文件中:
override func setupViews(){
super.setupViews()
addSubview(dateLabel)
dateLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
}
但是由于某些原因,我拥有的文本不会更改字体大小以适合UIlabel单元格。
试图适合的文本示例:
lazy var menuBar: MenuBar = {
let mb = MenuBar()
mb.homeController = self
return mb
}()
private func setupMenuBar() {
view.addSubview(menuBar)
view.addConstraintsWithFormat(format: "H:|[v0]|", views: menuBar)
view.addConstraintsWithFormat(format: "V:|-64-[v0(50)]", views: menuBar)
}
“ Todayyyyyyyyyy”未更改字体大小以使其完全适合。我需要调整其他哪些属性来解决问题?
答案 0 :(得分:0)
选项1-自动调整
将字体设置为较大并根据需要将其缩小,如下所示:
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.01
您只需要将初始大小设置为巨大即可。它只会缩小,而不会放大。
这里的缺点是,如果您做的事情确实很大,例如:
label.font = UIFont.systemFont(ofSize: 500)
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.0001
默认情况下,标签的高度基于500。
选项#2-手动调整紧身姿势
func updateLabel(_ s: String, label: UILabel) {
var size = 222 as CGFloat
repeat {
let textSize = s.size(withAttributes:[.font: UIFont.systemFont(ofSize:size)])
if textSize.width <= label.frame.width {
break
}
size -= 0.10
} while (size > 4)
label.font = UIFont.systemFont(ofSize: size)
label.text = s
}
快速样本:video和source code。 上面的标签使用选项#1,底部的标签使用选项#2。
您可以看到选项#2比系统管理的方法更好。可能还会占用更多的CPU资源,但是如果每个标签只执行一次,则可能无关紧要。
您的标签框可能不是您认为的大小,因为您只设置了 topAnchor 。您是否还在设置其他对象,或者是否进行宽度限制?
如果标签应该填满单元格,则可以执行以下操作:
override func setupViews(){
super.setupViews()
addSubview(dateLabel)
dateLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
dateLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
dateLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
dateLabel.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
}
另一个建议是在Xcode中运行该应用程序,然后使用视图调试器工具-单击此东西:
这将显示Xcode屏幕的分解图,以及所有视图的框架。检查标签是否真的符合您的想法。
答案 1 :(得分:0)
这就是我要这样做的方式(我喜欢使用@IBDesignable
,因此我也可以在情节提要中自由使用它)
extension UIFont {
func sizeOfString (string: String, constrainedToWidth width: Double) -> CGSize {
return NSString(string: string).boundingRect(with: CGSize(width: width, height: Double.greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: [NSAttributedStringKey.font: self],
context: nil).size
}
}
@IBDesignable public class TestLabel: UILabel {
@IBInspectable public var autoResize: Bool = false {
didSet {
decorate()
}
}
@IBInspectable public var resizeStep: CGFloat = 1.0 {
didSet {
decorate()
}
}
func decorate() {
// Here you can change whatever you want
var bestFontSize: CGFloat = 1
var testedFontSize: CGSize = self.font.withSize(bestFontSize).sizeOfString(string: self.text!, constrainedToWidth: Double.greatestFiniteMagnitude)
while testedFontSize.width < self.frame.width && testedFontSize.height < self.frame.height {
bestFontSize += 1
testedFontSize = self.font.withSize(bestFontSize).sizeOfString(string: self.text!, constrainedToWidth: Double.greatestFiniteMagnitude)
}
self.font = self.font.withSize(bestFontSize - self.resizeStep)
}
}
我只是在操场上对其进行了测试,所以我没有按照我的意图完全检查它是否在情节提要中正常工作,但是它应该功能完善,尽管它对bounds
或{{1}不太在意},但这只是说明如何使用它。
不过,仍然不建议从设计角度进行此操作。