UITableViewCell 位置问题内的 UIView - 已更新

Posted

技术标签:

【中文标题】UITableViewCell 位置问题内的 UIView - 已更新【英文标题】:UIView inside UITableViewCell position issue - UPDATED 【发布时间】:2015-11-30 19:57:22 【问题描述】:

这可要了我的命.. (.mov from my issue)

我想将我的自定义视图放置在我的自定义 tableViewCell 中。 做了这个简单的定位表达式: If : indexpath.row % 2 == 0 ---> 设置左侧视图(如 x: 10, y: 10) else:向右。

当应用启动时,所有气泡都在彼此下方。当我向下滚动到末尾时,它会重新定位。不是全部,而是其中一些。

我开始了我的代码,但还没有完成,因为这个小东西。我的代码如下:

TableViewController

class QuestionsTableViewController: UITableViewController 

    let c = "cell"
    var users = [User]()

    override func viewDidLoad() 
        super.viewDidLoad()
        for i in 0..<6 
        let user = User(firstName: "\(i) Karl", lastName: "May")
            users.append(user)
        
    
    // MARK: - Table view data source

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return users.count ?? 0
    


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> QuestionTableViewCell 

        let cell = tableView.dequeueReusableCellWithIdentifier(c, forIndexPath: indexPath) as! QuestionTableViewCell

          if indexPath.row % 2 == 0 
        cell.bubleView.frame.origin =  CGPoint(x: origin.x + 10, y: origin.y + 10)
        cell.bubleView.backgroundColor = UIColor.blueColor()
     else 
        cell.bubleView.frame.origin =  CGPoint(x: origin.x + 50, y: origin.y + 10)
        cell.bubleView.backgroundColor = UIColor.greenColor()
    
        // Configure the cell...
        cell.nameLabel.text = users[indexPath.row].firstName + " " + users[indexPath.row].lastName

        return cell
    

TableViewCell

class QuestionTableViewCell: UITableViewCell 

    @IBOutlet weak var bubleView: UIView!
    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    

    func positionBuble() 
        bubleView.frame.origin = CGPoint(x: contentView.frame.origin.y+10, y: contentView.frame.origin.y+10)
    

据我所知,这段代码应该可以工作,对吧?我在 Xcode Utilites 窗格上遗漏了什么吗? 我使用 Xcode 7.1.1

【问题讨论】:

可能有帮助的一件事是,从外观上看,您永远不会“取消调用”气泡框以在 UITableViewCell 中重置,并且由于您使用的是重用单元格,因此您必须将单元格重置为您认为的任何状态,“正常状态”,以便单元格重新对齐到您想要的位置,否则单元格将保留占用其内存槽的前一个单元格的值 您可以在自定义 UITableViewCell swift 文件中调用 "-(void)prepareForReuse 您的规范化代码到覆盖的“prepareForReuse”方法中,然后每次 tableView 将数据从数据源传递到视图中的单元格时重置单元格。 这只会部分解决您的头痛问题。单元格的另一部分从一开始就显示为被固定在左侧或右侧,我不得不弄乱你的代码,看看我们可以从中强制执行什么,而我没有时间这样做,所以看看准备细胞以供重复使用,看看你会发现什么。这应该可以解决当它应该被钉在右边或左边时,单元格被卡在左边或右边的问题。您在 cellforRowAtIndexPath 中的 if/then 语句没有“else”,您可以在其中调用以取消设置 TableViewCell 的视图,.. 所以 ... 从上面继续... 所以您可以在 PrepareForReuse 中重置视图,也可以在“cellForRowAtIndexPath”中完成“else”语句,无论哪种方式,您都将获胜。 Else 语句应根据 if 子句中的模 2 检查器将视图重置为左侧或右侧来对抗 if 语句。使用“else”子句将允许您不必使用 PrepareForReuse,因为视图的设置将发生在 Else 语句中,并为通过 cellforRowAtIndexPath 的每个单元格重置。这是您从重用中看到的副作用。 谢谢,但我是这样开始的:“我开始了我的代码,但还没有完成”。我尝试了首先,然后在这里发布我的问题。没有结果 【参考方案1】:

问题是您缺少else

    if indexPath.row % 2 == 0 
        let origin = cell.bounds.origin
        //cell.positionBuble()
        cell.bubleView.frame.origin =  CGPoint(x: origin.x + 10, y: origin.y + 10)
        cell.bubleView.backgroundColor = UIColor.blueColor()
     else 
        // what????
    

您需要这个,因为单元格可以重复使用。 indexPath.row % 2 == 0 的单元格将再次使用 indexPath.row % 2 != 0,但您没有进行任何更改,因此它们最终看起来都一样。

【讨论】:

是的,按照 Matt 在这里展示的方式进行操作,这就是我要说的大部分内容,这可能会让您一直获得您的 tableview 所需的答案 非常感谢您的代码,但我的初始代码是(没有效果,所以删除它): if indexPath.row % 2 == 0 cell.bubleView.frame.origin = CGPoint(x: origin .x + 10, y: origin.y + 10) cell.bubleView.backgroundColor = UIColor.blueColor() else cell.bubleView.frame.origin = CGPoint(x: origin.x + 50, y: origin.y + 10) cell.bubleView.backgroundColor = UIColor.greenColor() 链接:dropbox.com/sh/cyqjqafw2jxz7bw/…【参考方案2】:

所以,经过多次尝试,我创建了另一个原型单元,在其中设置了设计元素和运行时属性,然后称为新单元的标识符。虽然,仍然不知道为什么我的其他方法没有奏效......

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> QuestionTableViewCell 
        var cella: QuestionTableViewCell!

        if indexPath.row % 2 == 0  //c is an identifier String
            let cell = tableView.dequeueReusableCellWithIdentifier(c, forIndexPath: indexPath) as! QuestionTableViewCell
            cella = cell
         else  //b is also
            let cell = tableView.dequeueReusableCellWithIdentifier(b, forIndexPath: indexPath) as! QuestionTableViewCell
            cella = cell
        
        // Configure the cell...
        cella.nameLabel.text = users[indexPath.row].firstName + " " + users[indexPath.row].lastName
        //cella.tralala.blabla = ...other properties
        return cella
    

【讨论】:

以上是关于UITableViewCell 位置问题内的 UIView - 已更新的主要内容,如果未能解决你的问题,请参考以下文章

从外部源设置 UITableViewCell 内的内容?

uitableViewcell 内的 UIPickerView

UITableViewCell 内的 UIImageView 旋转动画

无法在 xcuitestcase 的 uitableviewcell 内的 uistackview 中找到带有图像的 uibutton

多行 UILabel 在 UITableViewCell 内的较小 iPhone 中截断或剪切字符串

滚动后 UITableViewCell 内的 UIView 中的渐变发生了变化