我遇到了在自定义表格单元格中显示ImageView的问题。我正在尝试执行以下操作:在cellForRowAtIndexPath中,我检查用户ID是否与预留对象内的id匹配。如果是这样,将在单元格的右侧显示ImageView(默认隐藏)。这一切都正常,直到iOS开始重用单元格。在重复使用的单元格上,ImageView始终位于单元格的左侧,而不是右侧(正常位置)。我试图找出为什么会这样,但我运气不好。我很感激你的帮助。
编辑:我似乎遇到了与此用户相同的问题: Custom cell imageView shifts to left side when editing tableView EDIT2:经过一些调试后,我发现只要细胞被重用,它的约束就会改变。首次创建单元格时调用constraintsAffectingLayoutForAxis(LayoutConstraintsAxis.Horizontal)
和
constraintsAffectingLayoutForAxis(LayoutConstraintsAxis.Vertical)
显示两个空数组。这些单元格是通过故事板制作的,所以我猜我不能用这些方法读取它们(?)
在细胞被重用之后我再次调用上面的方法它突然有一堆约束。然而,这些约束都是错误的,我认为这是图像视图错位的原因。
这是创建单元格后的日志:
Timelabel holds Optional(2) constraints
Horizontal constraints are: Optional([])
Vertical constraints are: Optional([])
ImageView holds Optional(4) constraints
Horizontal constraints are: Optional([])
Vertical constraints are: Optional([])
以下是我将单元格滚出视图并返回视图后打印的内容,使其重复使用:
Timelabel holds Optional(2) constraints
Horizontal constraints are: Optional([<NSLayoutConstraint:0x15d02a60 H:|-(38)-[UILabel:0x15f68500] (Names: '|':UITableViewCellContentView:0x15f7de60 )>, <NSContentSizeLayoutConstraint:0x15f4e3f0 H:[UILabel:0x15f68500(103)] Hug:251 CompressionResistance:750>])
Vertical constraints are: Optional([<NSLayoutConstraint:0x15f69600 V:|-(2)-[UILabel:0x15f68500] (Names: '|':UITableViewCellContentView:0x15f7de60 )>, <NSContentSizeLayoutConstraint:0x15f76d10 V:[UILabel:0x15f68500(21)] Hug:251 CompressionResistance:750>])
ImageView holds Optional(4) constraints
Horizontal constraints are: Optional([<NSLayoutConstraint:0x15d18390 H:[UIImageView:0x15f64260(47)]>, <NSLayoutConstraint:0x15f7c900 H:[UIImageView:0x15f64260]-(29)-| (Names: '|':UITableViewCellContentView:0x15f7de60 )>, <NSAutoresizingMaskLayoutConstraint:0x15f77b90 h=--& v=--& H:[UITableViewCellContentView:0x15f7de60(280)]>])
Vertical constraints are: Optional([<NSLayoutConstraint:0x15db4570 V:|-(0)-[UIImageView:0x15f64260] (Names: '|':UITableViewCellContentView:0x15f7de60 )>, <NSLayoutConstraint:0x15f736e0 V:[UIImageView:0x15f64260(48)]>])
我的cellForRowAtIndexPath方法:
func tableView(tableview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cellIdentifier = "ReservationCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? ReservationCell
let res: Reservation = reservationArray[indexPath.row]
let startTime = DateUtils.parseUTCDateTimeStringToTimeString(res.start)
let endTime = DateUtils.parseUTCDateTimeStringToTimeString(res.end)
cell!.delegate = self
let storedUserID = ELabAccount.getUserID()
let reservationUserID = String(res.reservedForId)
//Check if reservation belongs to currently logged in user
if(storedUserID == reservationUserID){
let buttons = NSMutableArray()
buttons.sw_addUtilityButtonWithColor(UIColor.lightGrayColor(), title: LocalizedString("edit"))
buttons.sw_addUtilityButtonWithColor(UIColor.redColor(), title: LocalizedString("delete"))
cell!.rightUtilityButtons = buttons as [AnyObject]
cell!.imageView!.hidden = false
cell!.backgroundColor = UIColor(red:0.42, green:0.64, blue:0.76, alpha:1.0)
}else{
cell!.backgroundColor = UIColor(red:1.00, green:0.55, blue:0.25, alpha:1.0)
}
cell!.timeLabel.text = startTime + " - " + endTime
cell!.nameLabel.text = res.reservedForName
return cell!
}
答案 0 :(得分:2)
好吧,我设法找到了解决方法。我最终做的是在我的自定义表格单元格的内容视图上将translateAutoresizingMaskIntoConstraints标志设置为false。这导致imageView在细胞重用后不再移动,但它确实将每个子视图向下移动,使得它们只有一半可见。使用Storyboard添加一些额外的约束来修复此问题。
答案 1 :(得分:0)
always ends up on the left side
不是很清楚,但我猜你遇到了一个问题:当你开始重复使用细胞时,图像出现在它理论上不应出现的地方。
这是因为当ID匹配时会显示图像视图,但当ID不匹配时它不会被隐藏。因此,通过重复使用先前ID成功匹配的单元格,将显示图像。
如果匹配失败,只需隐藏图片视图:
if(storedUserID == reservationUserID){
....
} else{
// hides the image view
cell!.imageView!.hidden = true
cell!.backgroundColor = UIColor(red:1.00, green:0.55, blue:0.25, alpha:1.0)
}