如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?

Posted

技术标签:

【中文标题】如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?【英文标题】:How to resize an custom UIView from NIB inside of a UITableViewCell with Swift? 【发布时间】:2015-03-14 10:03:26 【问题描述】:

我想将自定义视图加载到静态 UITableViewCell 并将视图大小调整为 UITableViewCell 的水平边界。

我实现了加载,但我坚持调整大小。也许一些天才会帮助我:)

针对这个问题,我创建了一个示例项目,可以在这里查看:GitHub Repository of project

以下是我执行的步骤:

UITableView

    创建了单视图应用

    在 StoryBoard 中删除了视图并将 TableViewController (TVC) 拖到 Storyboard 中。将其嵌入UINavigationController

    创建了一个类“MasterTableViewController”(MTVC) 作为UITableViewController 的子类。 在身份检查员处将 TVC 与 MTVC 连接起来。 在属性检查器中将UITableView 内容设置为“静态单元格” UITableView 有两个部分,每个部分都有一行。第一部分和第一行可以忽略。第二部分和第二行是从 nib 加载 uiview 的地方。 我从 UITableViewCell 创建了一个 Outlet,将在其中加载视图。

UIView

    我使用InterfaceBuilder 创建了一个自定义视图作为笔尖FirstDetailView.xib(FDV)。 添加了一些标签和文本字段。设置建议的限制条件。 然后我从UIView FirstDetailView.swift 创建了一个子类,在 Identity Inspector 上将它与笔尖上的 FDV 连接起来。 此时文本字段只有IBOutlet

加载中

    以下代码显示了 MTVC,其中包含将视图加载到 UITableViewCell 的代码:

导入UIKit

类 MasterTableViewController: UITableViewController

@IBOutlet weak var detailCell: UITableViewCell!

override func viewDidLoad() 
    super.viewDidLoad()

    // loading customized tableViewCell
    let nib = UINib(nibName: "FirstDetailView", bundle: nil)
    let nibs = nib.instantiateWithOwner(self, options:nil)
    let firstDetailView = nibs.first as? FirstDetailView
    if let firstView = firstDetailView 
        detailCell.contentView.addSubview(firstView)
    

当我点击播放时。视图将被加载到UITableViewCell。但是文本字段超出了视图范围。我该怎么做才能修复UIView 边界? (行的垂直大小不是问题。抱歉,由于声誉太低,我无法发布图片。请参阅 github 上的示例项目)

更新或新问题 如果我在文本字段中写内容。如何访问它们或从 tableViews ViewController 获取内容?

【问题讨论】:

【参考方案1】:

从 nib 加载视图并添加到单元格的 contentView,您应该对其添加约束以使其在单元格内正确定位。使用以下代码重试。

// do not translate autoresizingMask to constraints, create our own
firstView.setTranslatesAutoresizingMaskIntoConstraints(false)
detailCell.contentView.addSubview(firstView)

// pin firstView edges to its superview
let constraint1 = NSLayoutConstraint(item: firstView, attribute: .Right, relatedBy: .Equal, toItem: detailCell.contentView, attribute: .Right, multiplier: 1, constant: 0)
let constraint2 = NSLayoutConstraint(item: firstView, attribute: .Bottom, relatedBy: .Equal, toItem: detailCell.contentView, attribute: .Bottom, multiplier: 1, constant: 0)
let constraint3 = NSLayoutConstraint(item: firstView, attribute: .Left, relatedBy: .Equal, toItem: detailCell.contentView, attribute: .Left, multiplier: 1, constant: 0)
let constraint4 = NSLayoutConstraint(item: firstView, attribute: .Top, relatedBy: .Equal, toItem: detailCell.contentView, attribute: .Top, multiplier: 1, constant: 0)

detailCell.contentView.addConstraints([constraint1,constraint2,constraint3,constraint4])

【讨论】:

以上是关于如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用 UITableViewController 创建子菜单

如何快速编写[UITableViewCell 类]?

UITableVIewCell 错误 Xcode 7 / Swift 2

swift项目第二天:初始化项目

斯威夫特 - UITableViewCell?不能转换为 UITableViewCell

将一个水龙头从 UIScrollView 传递到其父视图