从数组中动态添加UIImageView

时间:2015-08-08 01:28:58

标签: ios swift uiimageview

我想动态地将UIImageViews数组添加到视图中。当我遍历for循环时,似乎只添加了最后一个UIImageView,而不是从数组中添加所有UIImageView:

// same image to be used 
let imageName = "img.png"
let image = UIImage(named: imageName)

// array of UIImageViews
var images : [UIImageView?] = Array(count: 10, repeatedValue: UIImageView(image: image))

// iterate and add to view
for i in 0...9 {

    // setup UIImageView
    // this is how I know only the last UIImageView is added to the parent view
    // the y cordinate is about 10 points down (this is expected of i+i array size with of 10)

    images[i]?.frame = CGRect(x: 10, y: CGFloat(i+i), width: image!.size.width, height: image!.size.height)   

    // add to parent view
    parentView.addSubview(images[i]!)

}

这有一个简单的解决方法吗?我觉得好像错过了一些明显的东西。

2 个答案:

答案 0 :(得分:0)

repeatedValue:UIImageView(image:image))只是将同一个对象传递给数组。所以你有一个10个引用相同图像的数组。

尝试将其用于测试将显示该函数在传递正确的imageview数组时将起作用

var images : [UIImageView] = [UIImageView(image: image), UIImageView(image: image), UIImageView(image: image), UIImageView(image: image), UIImageView(image: image)]

然后你应该添加5个UIImageViews作为子视图。

在数组中使用相同的图像并不是很有意义,除非它仅用于您的测试。您可能最好创建一组图像,以便只有唯一的图像。然后可以使用这些独特的图像来创建UIImageViews。

答案 1 :(得分:0)

由于您正在使用Array(count: 10, repeatedValue: UIImageView(image: image))repeatedValue表示您要添加到此数组的所有图像视图都会引用同一个对象。这样,您只有一个imageview,如何添加多个copys。检查我的答案。enter image description here

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let myWidth = 40
        let myHeight = 40

        // same image to be used
        let imageName = "img.png"
        let image = UIImage(named: imageName)

        // iterate and add to view
        for i in 0...9 {
            var imageView: UIImageView = UIImageView(image: image)
            imageView.frame = CGRect(x: 10, y: myHeight * i, width: myWidth, height: myHeight)

            // add to parent view
            self.view.addSubview(imageView)

        }
    }

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