为啥 UITableViewCell 宽度小于 UITableView 宽度

Posted

技术标签:

【中文标题】为啥 UITableViewCell 宽度小于 UITableView 宽度【英文标题】:Why is UITableViewCell width less than UITableView width为什么 UITableViewCell 宽度小于 UITableView 宽度 【发布时间】:2016-03-31 11:09:14 【问题描述】:

我正在尝试以编程方式创建 UITableView。我的单元格宽度有问题,它固定在 320,而表格宽度对于 iphone 6 是 375,对于 iphone 6 plus 是 414

如何使单元格宽度等于表格宽度?

查看类:

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource 

    override func viewDidLoad() 
        super.viewDidLoad()

        let myTableView = UITableView(frame: self.view.frame)
        myTableView.delegate = self
        myTableView.dataSource = self
        view.addSubview(myTableView)
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell:customTableViewCell = customTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "mycell")
        cell.backgroundColor = UIColor.blueColor()
        print("tableView width is \(tableView.frame.size.width)")
        return cell
    

自定义单元格类:

import UIKit

class customTableViewCell: UITableViewCell 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        configureView()
    

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)!
        configureView()
    

    func configureView() 

        print("cell width is \(self.frame.size.width)")
        print("cell bounds is \(self.contentView.frame.width)")
        let locationLabel = UILabel()
        locationLabel.frame = CGRectMake(0, 0  , self.frame.size.width,self.frame.size.height )
        locationLabel.text = "custom cell"
        locationLabel.backgroundColor = UIColor.blackColor()

        self.addSubview(locationLabel)
        // add and configure subviews here
    


运行代码时的结果:

单元格宽度为 320.0 单元格边界为 320.0 tableView 宽度为 414

screenshot

我正在使用 Xcode 7.3、Swift 2.2、ios 9.3

【问题讨论】:

检查这个...***.com/questions/26519248/… 我尽可能快地重写了它,没有任何改变 在快速检查中还有另一个答案...检查所有答案 你在哪里设置单元格的宽度?在您的代码中看不到。 在我发布的代码中我没有在任何地方设置它,我尝试在 cellForRowAtIndexPath 中设置它。 【参考方案1】:

也许你应该明确设置单元格的宽度,它现在有一个默认大小:

编辑

更改您的单元格类别:

import UIKit

class customTableViewCell: UITableViewCell 

    var locationLabel: UILabel = UILabel()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        configureView()
    

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)!
        configureView()
    

    func configureView() 

        print("cell width is \(self.frame.size.width)")
        print("cell bounds is \(self.contentView.frame.width)")
        locationLabel.text = "custom cell"
        locationLabel.textColor = UIColor.whiteColor()
        locationLabel.backgroundColor = UIColor.blackColor()

        self.addSubview(locationLabel)
        // add and configure subviews here
    


在 VC 中编辑:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell:customTableViewCell = customTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "mycell")
        cell.backgroundColor = UIColor.blueColor()
        cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height)
        cell.locationLabel.frame = cell.frame
        print("cell width in cellForRowAtIndexPath is \(cell.frame.size.width)")
        print("tableView width is \(tableView.frame.size.width)")
        return cell
    

输出:

cell width is 320.0
cell bounds is 320.0
cell width in cellForRowAtIndexPath is 414.0
tableView width is 414.0

【讨论】:

我尝试将宽度设置为表格视图类中的单元格框架、边界、内容视图。大小保持 320。 感谢@schmidt9,您的回答很好地解决了我遇到的问题。 @DanTImofte 如果有帮助请标记为答案 我已经投票了,当我有足够的声望时它会出现。

以上是关于为啥 UITableViewCell 宽度小于 UITableView 宽度的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UITableViewCell.layoutSubviews() 的 frame.width 为 600(通用故事板宽度)而不是 320(特定 iPhone 设备)?

表格的宽度不能小于 140 像素。为啥?

我在披露指标中看到了双 V 形。为啥以及如何解决这个问题? [关闭]

TextField 子视图未通过 UITableViewCell 框架大小更改调整大小

为啥对最大宽度的媒体查询不起作用?

更改 uitableviewcell 的宽度