当 UIScrollView 位于自定义 UITableViewCell 中时,将 UIScrollView 的内容大小设置为其框架宽度
Setting content size of UIScrollView to its frame width when UIScrollView is located in a Custom UITableViewCell
我已将 UIScrollView
添加到自定义 UITableViewCell
。
我设计了单元格并在故事板中添加了 scrollview
并在那里设置了约束。单元格和滚动视图的框架显示正确。
但是,我不希望 scrollview
水平滚动,所以我想将 contentSize.width
属性 设置为滚动视图框架的宽度。我正在我的自定义 UITableViewCell class' awakeFromNib
方法中为此设置我的代码。
问题是这个方法显然是在调整框架的宽度以适应当前尺寸的设备之前调用的,所以我得到的宽度是情节提要中的宽度,这太长了。
我在网上看到 viewDidLoad
和 viewDidLayoutSubviews
方法是在调整大小后调用的,但这些是 UIViewController
class 内部的方法。它们似乎不是 UITableViewCell
class 的一部分。
我不知道如何获取对 UIViewController
中每个自定义单元格的引用,以便在建议的方法中设置值。
谁能告诉我怎么做,或者我可以把这段代码放在 UITableViewCell
class 的什么地方?谢谢!
这是我的 UITableViewCell class 供参考。
import UIKit
class CustomTableViewCell: UITableViewCell, UIScrollViewDelegate {
@IBOutlet weak var winLoseValueLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var newTotalLabel: UILabel!
@IBOutlet weak var locationLabel: UILabel!
@IBOutlet weak var playersScrollView: CustomTableCellScrollView!
@IBOutlet weak var scrollContentView: UIView!
var numLinesInScrollView : CGFloat?
var tblView : UITableView?
var people : String?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.playersScrollView.tblView = tblView
numLinesInScrollView = 0.0
self.playersScrollView.contentSize.width = self.scrollContentView.frame.width
self.playersScrollView.contentSize.height = 100
self.playersScrollView.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 0, alpha: 0.25)
self.playersScrollView.addSubview(self.scrollContentView)
}
override func layoutSubviews() {
super.layoutSubviews()
//self.playersScrollView.contentSize.width = self.playersScrollView.frame.size.width
/*****Updating the contentSize did not work in this method either*****/
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
这是视图控制器。
import UIKit
class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tblView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidLayoutSubviews(){
super.viewDidLayoutSubviews()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataMgr.data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell : CustomTableViewCell = self.tblView.dequeueReusableCellWithIdentifier("ledgerCell", forIndexPath : indexPath) as! CustomTableViewCell
var values = dataMgr.data[indexPath.row]
cell.newTotalLabel?.text = "\(values.newTotal)"
cell.winLoseValueLabel?.text = "\(values.newTotal - values.currentTotal)"
cell.dateLabel?.text = "5/17/2015"
//cell.playersScrollView.contentSize.width = cell.playersScrollView.frame.width
/*****Adjusting contentSize did not work here either*****/
cell.tblView = self.tblView
return cell
}
}
我想出了一个可行的解决方案。我没有根据框架的宽度设置 contentSize,而是根据 window 的宽度以及从滚动视图框架到 window 边界的任一侧的距离来设置它。该方案允许将代码放在CustomTableViewCell的awakeFromNib()方法中class.
self.playersScrollView.contentSize.width = UIScreen.mainScreen().bounds.width - (self.playersScrollView.frame.minX * 4)
我唯一不明白的是为什么我必须将 window 边界和滚动视图的框架之间的距离乘以 4 而不是 2。我在滚动视图的两侧有相同的宽度, 但乘以 2 给出了错误的值,而乘以 4 给出了所有屏幕尺寸的正确值。
我已将 UIScrollView
添加到自定义 UITableViewCell
。
我设计了单元格并在故事板中添加了 scrollview
并在那里设置了约束。单元格和滚动视图的框架显示正确。
但是,我不希望 scrollview
水平滚动,所以我想将 contentSize.width
属性 设置为滚动视图框架的宽度。我正在我的自定义 UITableViewCell class' awakeFromNib
方法中为此设置我的代码。
问题是这个方法显然是在调整框架的宽度以适应当前尺寸的设备之前调用的,所以我得到的宽度是情节提要中的宽度,这太长了。
我在网上看到 viewDidLoad
和 viewDidLayoutSubviews
方法是在调整大小后调用的,但这些是 UIViewController
class 内部的方法。它们似乎不是 UITableViewCell
class 的一部分。
我不知道如何获取对 UIViewController
中每个自定义单元格的引用,以便在建议的方法中设置值。
谁能告诉我怎么做,或者我可以把这段代码放在 UITableViewCell
class 的什么地方?谢谢!
这是我的 UITableViewCell class 供参考。
import UIKit
class CustomTableViewCell: UITableViewCell, UIScrollViewDelegate {
@IBOutlet weak var winLoseValueLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var newTotalLabel: UILabel!
@IBOutlet weak var locationLabel: UILabel!
@IBOutlet weak var playersScrollView: CustomTableCellScrollView!
@IBOutlet weak var scrollContentView: UIView!
var numLinesInScrollView : CGFloat?
var tblView : UITableView?
var people : String?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.playersScrollView.tblView = tblView
numLinesInScrollView = 0.0
self.playersScrollView.contentSize.width = self.scrollContentView.frame.width
self.playersScrollView.contentSize.height = 100
self.playersScrollView.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 0, alpha: 0.25)
self.playersScrollView.addSubview(self.scrollContentView)
}
override func layoutSubviews() {
super.layoutSubviews()
//self.playersScrollView.contentSize.width = self.playersScrollView.frame.size.width
/*****Updating the contentSize did not work in this method either*****/
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
这是视图控制器。
import UIKit
class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tblView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidLayoutSubviews(){
super.viewDidLayoutSubviews()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataMgr.data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell : CustomTableViewCell = self.tblView.dequeueReusableCellWithIdentifier("ledgerCell", forIndexPath : indexPath) as! CustomTableViewCell
var values = dataMgr.data[indexPath.row]
cell.newTotalLabel?.text = "\(values.newTotal)"
cell.winLoseValueLabel?.text = "\(values.newTotal - values.currentTotal)"
cell.dateLabel?.text = "5/17/2015"
//cell.playersScrollView.contentSize.width = cell.playersScrollView.frame.width
/*****Adjusting contentSize did not work here either*****/
cell.tblView = self.tblView
return cell
}
}
我想出了一个可行的解决方案。我没有根据框架的宽度设置 contentSize,而是根据 window 的宽度以及从滚动视图框架到 window 边界的任一侧的距离来设置它。该方案允许将代码放在CustomTableViewCell的awakeFromNib()方法中class.
self.playersScrollView.contentSize.width = UIScreen.mainScreen().bounds.width - (self.playersScrollView.frame.minX * 4)
我唯一不明白的是为什么我必须将 window 边界和滚动视图的框架之间的距离乘以 4 而不是 2。我在滚动视图的两侧有相同的宽度, 但乘以 2 给出了错误的值,而乘以 4 给出了所有屏幕尺寸的正确值。