【问题标题】:UIImageView in UITableViewCell only appears after scrolling out of vision?UITableViewCell 中的 UIImageView 仅在滚动出视野后出现?
【发布时间】:2016-10-28 16:27:06
【问题描述】:

我在表格视图单元格中添加了一个UIImageView,并通过该单元格的viewWithTag 方法访问它。如果我只是将它添加到单元格的内容视图然后运行应用程序,图像视图就在那里,没有任何问题。但后来我想对该图像视图应用几行代码,使其成为圆形图像视图:

myImageView.layer.cornerRadius = myImageView.layer.frame.size.width / 2
myImageView.clipsToBounds = true
myImageView.layer.borderColor = UIColor.black.cgColor
myImageView.layer.borderWidth = 0.5

看起来不错,但问题是在我添加这些代码行之后,UIImageView 直到我向下滚动表格视图然后向上滚动以使单元格再次出现时才会出现。所以基本上这意味着图像视图仅在显示单元格的第二次加载。如何确保 UIImageView 在第一次需要通过表格视图显示单元格时就已经可见?

【问题讨论】:

  • 你在哪里添加了这些代码行?在cellForItem atIndex 委托方法中?
  • @MikeG cellForRowAtIndexPath 如果这就是你的意思,是的。
  • 是的,它已在 Swift 3 中进行了修改,抱歉造成混淆。我记得有一个像这样的问题,但我不记得我是如何解决它的。您能否为表格视图类添加其余代码?
  • @MikeG 为什么?其余代码没有添加任何内容,与我的图像视图或这个问题无关。您希望在我的其余代码中找到什么?

标签: swift uitableview uiimageview


【解决方案1】:

为您的表格视图单元格创建一个子类并将其设置在您的故事板中:

class MyTableViewCell: UITableViewCell {

   override func layoutSubviews() {
      super.layoutSubviews()
      // your border and corner radius settings
   }
 }

问题是您在单元格的生命周期中错误地设置了这些属性。使用这种方法,它会正常工作。

更新:另一种解决方案可能是在情节提要中使用 IBInspectables 并在 Attributes Inspector 中设置它们。请参阅下面的附件图像和代码。

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {
    get {
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }

  @IBInspectable var borderWidth: CGFloat {
    get {
        return layer.borderWidth
    }
    set {
        layer.borderWidth = newValue
    }
  }

  @IBInspectable var borderColor: UIColor {
    get {
        guard let borderc = layer.borderColor else {
            return UIColor()
        }
        return UIColor(CGColor: borderc)
    }
    set {
        layer.borderColor = newValue.CGColor
    }
  }
}

【讨论】:

  • 有没有办法手动调用layoutSubviews()?我有 8 个原型单元,它们都包含至少 6 个子视图,所以我只能想象从头开始重建我的整个表格视图只是为了让一些图像视图看起来像它们应该的那样是多么过分。
  • 一点也不夸张,因为 layoutSubviews() 会被自动调用。这只是您可以布置边框和半径的方式。如果您需要手动调用它,我建议您在单元格中设置 UI 后执行此操作。因此,在 cellForIndexPath 委托方法中,在您返回单元之前,只需执行以下操作:cell.layoutSubviews()
  • 尝试了这两个建议,但都没有奏效。我也尝试在cellWillDisplayAtIndexPath 中调用layoutSubviews(),但它也没有任何效果。我不明白如何根据cellForRowAtIndexPath 中提供的数据立即看到设置标签文本和类似的东西,但不知何故需要在稍后的时间点设置图像视图数据。它没有任何意义,除非它没有显示的原因是代码本身而不是代码执行的那一刻。标签/按钮/滑块等不也是单元格的子视图,就像图像视图一样吗?
  • 在返回单元格之前在 cellForRowAtIndexPath 中调用它。
  • 我做到了。这就是我一直称之为的地方。我帖子中的代码取自我的cellForRowAtIndexPath 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多