2015-01-04 62 views
9

我想在Swift PickerView中使用圖像。我不知道如何讓圖像真正出現在組件中。我知道如何使用帶有titleForRow函數的字符串來完成此操作,但我不知道如何使用圖像來執行此操作。這是我到目前爲止的代碼:如何讓圖像出現在Swift中的UI PickerView組件中?

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 
+0

如果我們有多個pickerviews比有可能是一個問題來,因爲viewForRow的,因爲不是所有的pickerview的將圖片只有一些和其他一些是正常的文本pickerviews只有比我們怎樣才能做到這一點? – ArgaPK

回答

14

您需要爲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 
} 

注意標籤佈局等只是用於演示,需要進行調整,或可能更好地使用自動佈局等。

+0

謝謝!這是我想要的。我想我需要viewForRow函數,但不能完全正確。感謝您的幫助。 –

+0

我想要有兩個組件與圖像。我可以用Strings做到這一點,但是當我使用上面的代碼(對一個組件很好用)時,我在數組中創建數組時遇到以下錯誤: UIImage沒有名爲「Element」的成員 –

+1

是否有如果我想要顯示50個不同的圖像,更好的方法來解決這個問題? –

0

你並不需要繼承UIPickerView(事實上這可能是不是無論如何繼承一個明智的觀點)。相反,您需要有一個實現UIPickerViewDelegate協議的對象。在此對象內,您將執行方法

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

此方法提供各個組件的視圖。在該方法中,您將從圖像數組中返回適當的值。

+0

如果我們有多個pickerviews,可能會有一個問題出現,因爲viewForRow,因爲並不是所有的pickerview將有圖像只有一些和其他一些是正常的pickerviews只有文本比我們如何實現這一目標? – ArgaPK

2

我有同樣的問題,並做了一些研究,直到我明白了。這是一個對我很好的例子。只要確保資產文件夾中的圖像全部與您的案例字符串命名相同,即可設置!

@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 
} 
+0

如果我們有多個pickerviews,可能會有一個問題出現,因爲viewForRow,因爲不是所有的pickerview將有圖像只有一些和其他一些是正常的pickerviews只有文本比我們怎麼能實現這一點? – ArgaPK

1

在處理很多事情時,製作switch語句可能很乏味。

相反,使用一個for循環這樣

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

} 
+0

如果我們有多個pickerviews,可能會有一個問題出現,因爲viewForRow,因爲並不是所有的pickerview的圖像只有一些和其他一些是正常的pickerviews只有文本比我們怎麼能實現這一點? – ArgaPK

相關問題