以编程方式更改集合视图单元格中标签的字体

Posted

技术标签:

【中文标题】以编程方式更改集合视图单元格中标签的字体【英文标题】:Change font of label in collection view cell programmatically 【发布时间】:2017-11-01 08:48:37 【问题描述】:

我有一个CollectionViewController如下

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource

  var dogs = ["Dog1", "Dog2","Dog3"]

@IBOutlet weak var collectionView: UICollectionView!

  override func viewDidLoad() 
        super.viewDidLoad()
        collectionView.delegate = self
        collectionView.dataSource = self
    
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

   let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
    cell.testLabel.text = dogs[indexPath.row]

    return cell

CustomCell如下

class CustomCell: UICollectionViewCell 

    @IBOutlet weak var testLabel: UILabel!

我喜欢将字体大小更改为上面的 18,但我得到的是我在情节提要中手动设置的字体。那么有没有办法可以在controller 中以编程方式更改字体,或者我需要在CustomCell 中更改它

附:刚刚发现会发生这种情况,当我在可用的设备尺寸上手动设置字体时,如果我删除了这些手动设备尺寸,它就可以工作。无论如何我可以覆盖它并同时拥有两者吗?

【问题讨论】:

替换 cell.testLabel.font = UIFont(name: "HelveticaNeue", size: 18) 为 cell.testLabel.font = UIFont.init(name: "HelveticaNeue", size: 18)跨度> 那行不通。 你能试试这个@IBOutlet weak var testLabel: UILabel! didSet testLabel.font = UIFont(name: "HelveticaNeue", size: 18) 我在 CustomCell 中试过了,就像你说的那样,它没有用。 您解决了问题还是仍然面临问题? 【参考方案1】:

这是我的问题。 及其解决方案非常简单 我们所要做的就是首先使用正确的字体字符串名称指定字体,然后添加字符串 即cell.testLabel.font = UIFont(name: "HelveticaNeue", size: 18) cell.testLabel.text = dogs[indexPath.row]

【讨论】:

谢谢兄弟,这对我有帮助【参考方案2】:

在“cellForItemAt”方法中直接改成

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

   let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
    cell.testLabel.text = ["Dog1", "Dog2", "Dog3"]

    cell.testLabel.font = UIFont(name: "HelveticaNeue", size: 18)

    return cell

【讨论】:

【参考方案3】:

使用此代码会对您有所帮助

label.font = label.font.fontWithSize(20) //20 is font size

斯威夫特 3:

label.font = label.font.withSize(20)

或者试试

UIFont.systemFont(ofSize: 18)

【讨论】:

你把那个放在哪里了? 在“cellForItemAtIndexPath”委托方法中 那没有帮助 试试 UIFont.systemFont(ofSize: 18) 那不起作用,我也不想使用系统字体。【参考方案4】:

使用awakeFromNib方法,来自苹果documentation,

nib 加载基础架构向每个 从 nib 存档重新创建的对象,但仅在所有对象之后 存档已加载并初始化。当一个对象收到 一个 awakeFromNib 消息,它保证有它的所有出口和 动作连接已经建立。

您可以通过此方法更改标签字体。

class CustomCell: UICollectionViewCell 
    @IBOutlet weak var testLabel: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
        testLabel.font = UIFont(name: "HelveticaNeue", size: 18)
    

【讨论】:

尝试将字体名称更改为“HelveticaNeue-Bold”,看看是否有效 刚刚发现会发生这种情况,当我在可用的设备尺寸上手动设置字体时,如果我删除了这些手动设备尺寸,它就可以工作。无论如何我可以覆盖它并同时拥有两者吗?【参考方案5】:

您需要将 cellForItemAt 更改为:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell

      cell.testLabel.text = "Dog 1"
      cell.testLabel.font = UIFont(name: "HelveticaNeue", size: 18)

      return cell

那么请检查以下内容:

    您的重用标识符已在情节提要中正确设置。 您的 collectionView 委托已设置。 您的 collectionView 数据源已设置。 标签的插座已连接。 您重新加载 collectionView 数据 检查字体名称是否正确,可以在mac上使用FontBook进行拼写检查。

【讨论】:

你在哪里重新加载collectionView数据? 您是如何获得要在 collectionView 中显示的数据的? 来自那群狗 确保使用 cell.testLabel.text = "Dog 1",而不是字符串数组。 我编辑了我的问题以反映你所说的,但它仍然不起作用【参考方案6】:

首先我不明白你为什么在cellForItemAtdelegate方法里面写func viewDidLayoutSubviews()。只需从那里删除它。

其次,您不需要在viewDidLoad() 中调用collectionView.reloadData(),因为它会在第一次使用您提供的数据时自动加载collectionView

在继续更改字体之前,请检查系统中是否有您所需的字体(HelveticaNeue)。如果没有,请先安装字体并将其添加到您的项目中。

现在将更改 fontlabel。它可以通过两种方式完成:

1.在您的CustomCell 中使用awakeFromNib(),即

class CustomCell: UICollectionViewCell

    @IBOutlet weak var testLabel: UILabel!

    override func awakeFromNib()
    
        super.awakeFromNib()
        self.testLabel.font = UIFont(name: "HelveticaNeue", size: 18)
    

这将设置单元格的字体仅在从笔尖加载单元格时设置一次。如果label's font 配置一次后没有进一步变化,则推荐

2.cellForItemAt中配置字体,即

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
    cell.testLabel.text = dogs[indexPath.row]
    cell.testLabel.font = UIFont(name: "HelveticaNeue", size: 18)
    return cell

这将设置单元格的字体每次调用cellForItemAt delegate 方法,即每次重新加载单元格时。如果您想在重新加载时对单元格进行任何有条件的更改,请使用此选项。

【讨论】:

刚刚发现会发生这种情况,当我在可用的设备尺寸上手动设置字体时,如果我删除了这些手动设备尺寸,它就可以工作。无论如何我可以覆盖它并同时拥有两者吗? 我不明白你想达到什么目的。

以上是关于以编程方式更改集合视图单元格中标签的字体的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将按钮添加到集合视图单元格

以编程方式创建形状视图并在集合视图单元格上使用

动态表格视图单元格,以编程方式更改子视图高度

无法根据objective-c中标签的文本大小设置单元格大小

为啥在集合视图单元格中以编程方式创建的按钮需要是惰性变量?

标签文本增加时如何以编程方式增加集合视图单元格高度?