具有静态表的动态类型和自定尺寸单元

pro*_*asm 14 uitableview ios swift ios9

我有一个典型的主从细节应用程序,允许用户浏览滚动的对象列表,然后使用推送segue钻取任何特定对象的详细信息.滚动主列表是使用原型单元格构建的UITableView,细节场景是具有固定数量的节和单元格的静态UITableView.

我想在我的应用程序中实现Dynamic Type和Self-Sizing Cells,以便用户可以更改基本字体大小.到目前为止,我已成功使用原型单元的滚动列表制作自调整单元格:通过使用自动布局,将每个标签中的行数设置为0,并设置tableView.rowHeight = UITableViewAutomaticDimension,每个原型单元格的高度增大或缩小以适应内的文字大小.

但我无法在静态表视图中实现相同的效果.无论我使用自定义单元格还是内置单元格类型,字体都会增大/缩小,但单元格高度则不会.

所以我的问题实际上是两个问题:1)是否有可能在静态表视图中实现自调整单元格,就像我对原型表视图一样?2)如果第一个问题的答案为否,我如何编写测量静态表格视图单元格中标签高度的代码并适当调整单元格高度?

谢谢!

Ben*_*air 19

静态表视图返回Interface Builder中设置的行高.tableView.rowHeight设置似乎完全被忽略了.这显然是UIKit中的一个错误.

为了解决这个问题,只需覆盖-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath并返回即可UITableViewAutomaticDimension.


pro*_*asm 1

我很感谢您对我昨天发布的问题提供的答案。不幸的是(可能是因为我自己作为一名 iOS 程序员缺乏经验)我无法使 systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 方法发挥作用。然而,经过一番尝试和错误后,我发现了一种似乎有效的不同方法:

import UIKit

class MasterTVC: UITableViewController {
    @IBOutlet weak var staticCustomCellLabel: UILabel!

    //viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 44.0

        staticCustomCellLabel.text = "This is the text for the static custom cell label; This is the text for the static custom cell label; This is the text for the static custom cell label"

        //Register handleDynamicTypeChange in observer: self
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleDynamicTypeChange:", name: UIContentSizeCategoryDidChangeNotification, object: nil)
    }

    //deinit
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    //handleDynamicTypeChange
    //called when user changes text size in Settings > General > Accessibility > Larger Text
    //or Settings > Display & Brightness > Text Size
    func handleDynamicTypeChange(notification: NSNotification) {
        staticCustomCellLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)

        self.tableView.reloadData()
    }

    //tableView:heightForRowAtIndexPath
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
}
Run Code Online (Sandbox Code Playgroud)

在故事板方面,设置从具有以下属性的单个表视图控制器开始:

  • 班级:MasterTVC(我的自定义班级);
  • 指定初始视图控制器;
  • 内容:静态单元格;
  • 风格:分组
  • 章节: 1.

第 1 节:

  • 行:1。

表格视图单元格:

  • 样式:自定义(此处使用基本会导致在“设置”中更改文本大小时标签消失);
  • 包含 UILabel。

UILabel进一步配置为:

  • 字体:正文(动态类型样式);
  • 线路:0;
  • 固定在内容视图的顶部、底部、左侧和右侧边缘的所有四个边上(我使用了相应的约束 8、8、15、15);
  • 在自定义类代码中使用@IBOutlet。

这对我在启用自动布局的 Xcode 7 和 Swift 2 中为 iOS 9 进行设计很有用。有趣的是,如果去掉用于立即响应文本大小变化的 NSNotificationCenter 代码,自调整单元格代码基本上就是两行:在 viewDidLoad 中设置estimatedRowHeight,并从 tableView:heightForRowAtIndexPath 返回 UITableViewAutomaticDimension。

根据这些结果,我相信我最初问题的答案是:1)是;2) 参见 1。