当 UIScrollView 位于自定义 UITableViewCell 中时,将 UIScrollView 的内容大小设置为其框架宽度

Posted

技术标签:

【中文标题】当 UIScrollView 位于自定义 UITableViewCell 中时,将 UIScrollView 的内容大小设置为其框架宽度【英文标题】:Setting content size of UIScrollView to its frame width when UIScrollView is located in a Custom UITableViewCell 【发布时间】:2015-05-28 01:09:55 【问题描述】:

我已将UIScrollView 添加到自定义UITableViewCell

我设计了单元格并在我的故事板中添加了scrollview 并在那里设置了约束。单元格和滚动视图的框架显示正确。

但是,我不希望我的scrollview 水平滚动,所以我想将contentSize.width 属性设置为滚动视图框架的宽度。我在我的自定义 UITableViewCell 类的awakeFromNib 方法中为此设置了我的代码。

问题是这个方法显然是在调整框架宽度以适应当前尺寸设备之前调用的,所以我得到的宽度是故事板中的宽度,太长了。

我在网上看到viewDidLoadviewDidLayoutSubviews这两个方法是在调整大小后调用的,但这些都是UIViewController类里面的方法。它们似乎不是UITableViewCell 类的一部分。

我不知道如何获取对 UIViewController 中每个自定义单元格的引用,以便在建议的方法中设置值。

谁能告诉我怎么做,或者我可以把这段代码放在UITableViewCell类的什么地方?谢谢!

这是我的 UITableViewCell 类供参考。

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
    


【问题讨论】:

- (void)layoutSubviews 方法是UIView 类的一部分:developer.apple.com/library/ios/documentation/UIKit/Reference/… 呢? 不幸的是,它在那里也不起作用。 【参考方案1】:

我想出了一个可行的解决方案。我没有根据框架的宽度设置 contentSize,而是根据窗口的宽度以及从滚动视图框架到窗口边界的任一侧的距离来设置它。此方案允许将代码放在 CustomTableViewCell 类的 awakeFromNib() 方法中。

self.playersScrollView.contentSize.width = UIScreen.mainScreen().bounds.width - (self.playersScrollView.frame.minX * 4)

我唯一不明白的是为什么我必须将窗口边界和滚动视图框架之间的距离乘以 4 而不是 2。我在滚动视图的两侧具有相同的宽度,但乘以 2 给出不正确的值,而乘以 4 在所有屏幕尺寸上给出正确的值。

【讨论】:

以上是关于当 UIScrollView 位于自定义 UITableViewCell 中时,将 UIScrollView 的内容大小设置为其框架宽度的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 水平和垂直滚动的策略

使用自定义 UIControl 自动调整 UIScrollView 内容偏移

当 UITextField 位于 UIScrollView 内时,使用 Tap Gesture 关闭键盘的问题。

iphone uiscrollview - 自定义分页距离

将捏合手势从自定义 UIView 传递到父 UIScrollView

iPhone UIScrollview:当位于 Scroll View 的子 UIView 上的 480 像素以下时,按钮不响应