【问题标题】:How can I get images to appear in UI PickerView Component in Swift?如何让图像出现在 Swift 的 UI PickerView 组件中?
【发布时间】:2015-01-04 19:04:27
【问题描述】:

我正在尝试在 Swift PickerView 中使用图像。我不知道如何让图像实际出现在组件中。我知道如何使用带有 titleForRow 函数的字符串来做到这一点,但我不知道如何使用图像来做到这一点。到目前为止,这是我的代码:

import UIKit
class ViewController: UIViewController, UIPickerViewDelegate {

    @IBOutlet weak var pickerView: UIPickerView!


    var imageArray: [UIImage] = [UIImage(named: "washington.jpg")!,
        UIImage(named: "berlin.jpg")!, UIImage(named: "beijing.jpg")!,
        UIImage(named: "tokyo.jpg")!]



    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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


    // returns the number of 'columns' to display.
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{

        return 1

    }

    // returns the # of rows in each component..
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        return imageArray.count
    }



}// end of app

【问题讨论】:

  • 如果我们有多个pickerviews,那么可能会因为viewForRow而出现问题,因为并非所有pickerview都只有一些图像,而其他一些是只有文本的普通pickerviews,我们如何才能实现这一点??
  • 我也对这个@ArgaPK 感到困惑。有人帮忙吗??

标签: ios swift uipickerview


【解决方案1】:

您将需要为 UIPickerViewDelegate 协议实现更多的委托方法。特别是 rowHeight 委托方法和 viewForRow 委托方法。

类似:

// MARK: UIPickerViewDataSource

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return 2
}

 func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
    return 60
}


// MARK: UIPickerViewDelegate

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {

    var myView = UIView(frame: CGRectMake(0, 0, pickerView.bounds.width - 30, 60))

    var myImageView = UIImageView(frame: CGRectMake(0, 0, 50, 50))

    var rowString = String()
    switch row {
    case 0:
        rowString = “Washington”
        myImageView.image = UIImage(named:"washington.jpg")
    case 1:
        rowString = “Beijing”
        myImageView.image = UIImage(named:"beijing.jpg")
    case 2:
        default:
        rowString = "Error: too many rows"
        myImageView.image = nil
    }
    let myLabel = UILabel(frame: CGRectMake(60, 0, pickerView.bounds.width - 90, 60 ))
    myLabel.font = UIFont(name:some font, size: 18)
    myLabel.text = rowString

    myView.addSubview(myLabel)
    myView.addSubview(myImageView)

    return myView
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

   // do something with selected row
}

请注意,标签布局等仅用于演示,需要进行调整,或者使用自动布局等可能更好。

【讨论】:

  • 谢谢!这正是我想要的。我想我需要 viewForRow 函数,但不能完全正确。非常感谢您的帮助。
  • 我试图有两个组件,每个组件都有一个图像。我可以用字符串做到这一点,但是当我使用上面的代码(这对一个组件很有用)时,在数组中创建数组时出现以下错误:UIImage 没有名为“Element”的成员
  • 如果我要显示 50 张不同的图像,有没有更好的方法来解决这个问题?
  • @NormanG 如果我们有多个pickerviews,那么由于viewForRow 可能会出现问题,因为并非所有的pickerview 都会只有一些图像,而另一些是只有文本的普通pickerviews,我们如何才能实现这一点? ?
【解决方案2】:

我有同样的问题并做了一些研究,直到我弄明白为止。这是一个对我很有用的例子。只要确保您在 Assets 文件夹中的图像都与您的案例字符串命名相同,您就可以设置了!

@IBOutlet weak var pickerView: UIPickerView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    pickerView.delegate = self
}

// MARK: UIPickerViewDataSource

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return 11
}

// MARK: UIPickerViewDelegate

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {


    var myImageView = UIImageView()

    switch row {
    case 0:
        myImageView = UIImageView(image: UIImage(named:"airplane"))
    case 1:
        myImageView = UIImageView(image: UIImage(named:"beach"))
    case 2:
        myImageView = UIImageView(image: UIImage(named:"bike"))
    case 3:
        myImageView = UIImageView(image: UIImage(named:"hiking"))
    case 4:
        myImageView = UIImageView(image: UIImage(named:"ironman"))
    case 5:
        myImageView = UIImageView(image: UIImage(named:"moneybag"))
    case 6:
        myImageView = UIImageView(image: UIImage(named:"moneybills"))
    case 7:
        myImageView = UIImageView(image: UIImage(named:"ninjaturtle"))
    case 8:
        myImageView = UIImageView(image: UIImage(named:"running"))
    case 9:
        myImageView = UIImageView(image: UIImage(named:"shoppingcart"))
    case 10:
        myImageView = UIImageView(image: UIImage(named:"workingout"))
    default:
        myImageView.image = nil

        return myImageView
    }
    return myImageView
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    // do something with selected row
}

【讨论】:

  • 如果我们有多个pickerviews,那么可能会因为viewForRow而出现问题,因为并非所有pickerview都只有一些图像,而其他一些是只有文本的普通pickerviews,我们如何才能做到这一点??
【解决方案3】:

在处理大量内容时,使用 switch 语句可能会很乏味。

相反,使用这样的 for 循环

for _ in 1..<imageArray.count {
myImageView.image = UIImage(named: imageArray[row])

}

【讨论】:

  • 如果我们有多个pickerviews,那么可能会因为viewForRow而出现问题,因为并非所有pickerview都只有一些图像,而其他一些是只有文本的普通pickerviews,我们如何才能做到这一点??
【解决方案4】:

您不需要子类化UIPickerView(事实上这可能不是子类化的明智观点)。相反,您需要一个实现UIPickerViewDelegate 协议的对象。在此对象中,您将实现该方法

optional func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView

此方法提供各个组件的视图。在该方法中,您将从图像数组中返回适当的值。

【讨论】:

    【解决方案5】:
    var pickerDataSource = [UIImage(named:"house-7"),UIImage(named:"house-7"),UIImage(named:"house-7"),UIImage(named:"house-7"),UIImage(named:"house-7")]   
    
    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let myImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 61))
        myImageView.image = pickerDataSource[row]
        return myImageView
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多