如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?
How to resize an custom UIView from NIB inside of a UITableViewCell with Swift?
我想将自定义视图加载到静态 UITableViewCell
并将视图的大小调整到 UITableViewCell
的水平边界。
我实现了加载,但我坚持调整大小。也许一些天才会帮助我 :)
针对这个问题,我创建了一个示例项目,可以在这里查看:GitHub Repository of project
以下是我执行的步骤:
UITableView:
创建了一个单一视图应用程序
在StoryBoard中删除了View,拖了一个TableViewController
(TVC)到Storyboard。将其嵌入 UINavigationController
.
- 创建了 class "MasterTableViewController" (MTVC) 作为
UITableViewController
的子class。
- 在身份检查器中将 TVC 与 MTVC 连接。
- 在属性检查器中将
UITableView
内容设置为 "Static Cells"
UITableView
有两部分,每部分占一行。第一部分和第一行可以忽略。第二部分和行是将加载来自 nib 的 uiview 的位置。
- 我从将加载视图的
UITableViewCell
创建了一个 Outlet。
UIView:
- 我使用
InterfaceBuilder
. 创建了一个自定义视图作为笔尖 FirstDetailView.xib
(FDV)
- 添加了一些标签和文本字段。设置建议的约束条件。
- 然后我从
UIView
FirstDetailView.swift
创建了一个 subclass,在 Identity Inspector 中将它与笔尖处的 FDV 连接起来。
此时只有 IBOutlet
用于 TextFields。
加载中:
- 以下代码显示了 MTVC 以及将视图加载到
UITableViewCell
的代码:
进口UIKit
class 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
界限?
(行的垂直大小不是问题。抱歉,由于声誉不高,我无法 post 图片。请参阅示例项目 github)
更新或新问题
如果我在文本字段中写入内容。我如何访问它们或从 tableViews 中获取内容 ViewController?
视图从 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])
我想将自定义视图加载到静态 UITableViewCell
并将视图的大小调整到 UITableViewCell
的水平边界。
我实现了加载,但我坚持调整大小。也许一些天才会帮助我 :)
针对这个问题,我创建了一个示例项目,可以在这里查看:GitHub Repository of project
以下是我执行的步骤:
UITableView:
创建了一个单一视图应用程序
在StoryBoard中删除了View,拖了一个
TableViewController
(TVC)到Storyboard。将其嵌入UINavigationController
.- 创建了 class "MasterTableViewController" (MTVC) 作为
UITableViewController
的子class。 - 在身份检查器中将 TVC 与 MTVC 连接。
- 在属性检查器中将
UITableView
内容设置为 "Static Cells" UITableView
有两部分,每部分占一行。第一部分和第一行可以忽略。第二部分和行是将加载来自 nib 的 uiview 的位置。- 我从将加载视图的
UITableViewCell
创建了一个 Outlet。
UIView:
- 我使用
InterfaceBuilder
. 创建了一个自定义视图作为笔尖 - 添加了一些标签和文本字段。设置建议的约束条件。
- 然后我从
UIView
FirstDetailView.swift
创建了一个 subclass,在 Identity Inspector 中将它与笔尖处的 FDV 连接起来。 此时只有IBOutlet
用于 TextFields。
FirstDetailView.xib
(FDV)
加载中:
- 以下代码显示了 MTVC 以及将视图加载到
UITableViewCell
的代码:
进口UIKit
class 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
界限?
(行的垂直大小不是问题。抱歉,由于声誉不高,我无法 post 图片。请参阅示例项目 github)
更新或新问题 如果我在文本字段中写入内容。我如何访问它们或从 tableViews 中获取内容 ViewController?
视图从 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])