在scrollView中显示图像不正确

时间:2015-10-29 20:43:56

标签: swift uitableview uiscrollview tableview

我想在自定义tableViewCell中的滚动视图中显示我的图像。它确实显示一些图像,但它们是错误的。我相信它是因为它们被重复使用,因此在不应该是图像的情况下,它会被反复显示。

此外,我的图像变得更亮/更暗,因为当我向上或向下滚动时,它会再次被创建,从而将更多的scrollViews叠加在一起或仅仅是图像。

//global
var masterImageArray = Array<Array<UIImage>>() //holds ALL of my images

//other info for my scrollview to use
let imageWidth: CGFloat = 100
let imageHeight: CGFloat = 200
let yPosition: CGFloat = 0
var xPosition: CGFloat = 0
var scrollViewContentSize: CGFloat = 0


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: FriendsFeedTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as! FriendsFeedTableViewCell

    // holds array of UIImages to display in scrollView
    let images = masterImageArray[indexPath.row] 

    //scrollView to display images ([UIImage])

        for var i = 0; i < images.count; i++ { //images will vary

            let myImage: UIImage = images[i]

            let myImageView: UIImageView = UIImageView()

            myImageView.image = myImage

            myImageView.frame.size.width = imageWidth
            myImageView.frame.size.height = imageHeight
            myImageView.frame.origin.x = xPosition

            cell.imageScrollView.addSubview(myImageView)

            xPosition = imageWidth
            scrollViewContentSize += imageWidth

            cell.imageScrollView.contentSize = CGSize(width: scrollViewContentSize, height: imageHeight)
        }
}

我的问题是,如何正确显示它们?如何停止重复使用&#34;或者在彼此之上创造他人。我应该将此代码放在tableViewCell文件中吗?

----编辑:1 ------

在关注@joern的建议后,我使用了3个UIImageViews来显示图像,而不是创建和销毁每个UIImageView。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: FriendsFeedTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as! FriendsFeedTableViewCell

    let images = masterImageArray[indexPath.row]

    var imageViews = [UIImageView]()

    imageViews.append(cell.imageView_1)
    imageViews.append(cell.imageView_2)
    imageViews.append(cell.imageView_3)

    for var i = 0; i < images.count; i++ {
        imageViews[i].image = images[i]
    }
}

1 个答案:

答案 0 :(得分:1)

这里有两个主要问题:

  1. 您不会增加xPosition
  2. 应该是:

    xPosition = 0
    for var i = 0; i < images.count; i++ { //images will vary
        ...
        xPosition += imageWidth
        ....
    }
    
    1. 在重复使用之前,您不会从单元格重置图像。
    2. 您必须在重复使用单元格之前重置图像。您可以在自定义单元类中执行此操作。要完成这项工作,您应该将所有与图像相关的代码移动到您的单元类中。将您的imageView保存在数组中以访问它们并在prepareForReuse中重置它们。为了简单起见,我假设在这个例子中,一个单元格永远不会有超过3个图像:

      class CustomTableViewCell: UITableViewCell {
      
          let imageViews = [UIImageView]()
          ....
      
          override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
              super.init(style: style, reuseIdentifier: reuseIdentifier)
      
              for _ in 0...2 {
                  let imageView = UIImageView()
                  // setup and position the image view in your scroll view
                  imageViews.append(imageView)
              }
          }
      
          override func prepareForReuse() {
              for imageView in imageViews {
                  imageView.image = nil
              }
          }
      
          func updateImages(images: [UIImage]) {
              var imageIndex = 0
              for image in images {
                  imageViews[imageIndex].image = image
              }
          }
      }
      

      然后在cellForRowAtIndexPath的视图控制器中,在您出列的单元格上调用updateImages。系统会自动调用prepareForReuse,您不会自己调用它。

      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
          let cell: FriendsFeedTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as! FriendsFeedTableViewCell
          cell.updateImages(masterImageArray[indexPath.row])
          ...
      }