3

I need to implement UIPickerView like this:

enter image description here

But default implementation gives this:

enter image description here

I used this UIPickerDatasourse method:

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

        var pickerLabel = view as? UILabel;

        if (pickerLabel == nil)
        {
            pickerLabel = UILabel()
            pickerLabel?.textAlignment = NSTextAlignment.Center
        }

        pickerLabel?.attributedText = help_getAttributedStringForWalletByAmount(ApiManager.sharedInstance.userService_currentUser!.arrayCurrencyAccounts[row].balance, currency: EnumCurrency(rawValue: ApiManager.sharedInstance.userService_currentUser!.arrayCurrencyAccounts[row].currency))
        pickerLabel?.sizeToFit()

        return pickerLabel!;
    }

Is it possible to make bigger scaling? Or may be is there any other workaround ?

Paul T.
  • 4,938
  • 7
  • 45
  • 93

2 Answers2

1

You can try like,

func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
     let color = (row == pickerView.selectedRowInComponent(component)) ? UIColor.orangeColor() : UIColor.blackColor()
     return NSAttributedString(string: colors[row], attributes: [NSForegroundColorAttributeName: color])
 }

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

It is changing color, you try fontsize in attributed string.

Update:

refer this answer as mentioned in it don't implement titleFoRrow at all only implement viewForRow. and setup label with desired font size.

Hope this will help :)

Community
  • 1
  • 1
Ketan Parmar
  • 27,092
  • 9
  • 50
  • 75
  • it's impossible to set font size with attributedTitleForRow method (you can set colour, but not a font size), but I will try it with method func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView – Paul T. May 27 '16 at 07:49
  • it's not smooth, I will try to add animation – Paul T. May 27 '16 at 12:52
0

Lion's answer actually works, but it's not smooth, so when you select another row, it's not user friendly (I think it works with colours, but for different fonts it's not the best solution). So I decided to affine transforms. Here is the code:

// MARK: - Picker View Help

    func pickerViewHelp_afterRowWasSelected(row: Int) {
        let accountSelected = ApiManager.sharedInstance.userService_currentUser!.arrayCurrencyAccounts[row]
        // save ID of this currency account in NSDefaults
        DefaultsManager.sharedInstance.getDefaultsForSharingBetweenExtensions().setValue(accountSelected.id, forKey: kNSDefaults_mainCurrencyAccountID)
        DefaultsManager.sharedInstance.getDefaultsForSharingBetweenExtensions().synchronize()
        // reload scales
        delay(0) { [weak self] in
            self?.pickerViewHelp_updateFontsForAllRows(self!.pickerViewAccounts, selectedIndex: row)
        }
    }

    func pickerViewHelp_updateFontsForAllRows(pickerView: UIPickerView, selectedIndex: Int) {
        if pickerViewHelp_rowWasChangedBeforeReloadingPicker { // we changed the row
            // remove prev animation
            for i in 0..<pickerView.numberOfRowsInComponent(0) {
                let pickerLabel = pickerViewHelp_dictOfViewsInPicker[i] as? UILabel
                pickerLabel?.layer.removeAllAnimations()
            }
            // start new animation
            for i in 0..<pickerView.numberOfRowsInComponent(0) {
                UIView.animateWithDuration(0.3) { [weak self] in
                    let scale: CGFloat = (i == selectedIndex) ? 1 : 0.5
                    //                let pickerLabel = pickerView.viewForRow(i, forComponent: 0) as? UILabel
                    let pickerLabel = self?.pickerViewHelp_dictOfViewsInPicker[i] as? UILabel
                    var transform = CATransform3DIdentity
                    transform = CATransform3DScale(transform, scale, scale, 1.01)
                    pickerLabel?.layer.transform = transform
                }
            }
        }
        else if pickerViewHelp_previouslySelectedRow == -1  { // first setup of the picker or we selected the same row
            // remove prev animation
            for i in 0..<pickerView.numberOfRowsInComponent(0) {
                let pickerLabel = pickerViewHelp_dictOfViewsInPicker[i] as? UILabel
                pickerLabel?.layer.removeAllAnimations()
            }
            // without animation
            for i in 0..<pickerView.numberOfRowsInComponent(0) {
                let scale: CGFloat = (i == selectedIndex) ? 1 : 0.5
                let pickerLabel = pickerViewHelp_dictOfViewsInPicker[i] as? UILabel
                var transform = CATransform3DIdentity
                transform = CATransform3DScale(transform, scale, scale, 1.01)
                pickerLabel?.layer.transform = transform
            }
        }
        else { // repeat 1 if (for now I want leave in like this, because if smth is wrong, I will need to change it separately
            // remove prev animation
            for i in 0..<pickerView.numberOfRowsInComponent(0) {
                let pickerLabel = pickerViewHelp_dictOfViewsInPicker[i] as? UILabel
                pickerLabel?.layer.removeAllAnimations()
            }
            // start new animation
            for i in 0..<pickerView.numberOfRowsInComponent(0) {
                UIView.animateWithDuration(0.3) { [weak self] in
                    let scale: CGFloat = (i == selectedIndex) ? 1 : 0.5
                    //                let pickerLabel = pickerView.viewForRow(i, forComponent: 0) as? UILabel
                    let pickerLabel = self?.pickerViewHelp_dictOfViewsInPicker[i] as? UILabel
                    var transform = CATransform3DIdentity
                    transform = CATransform3DScale(transform, scale, scale, 1.01)
                    pickerLabel?.layer.transform = transform
                }
            }
        }


    }

    // MARK: - Picker view

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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if ApiManager.sharedInstance.userService_currentUser?.arrayCurrencyAccounts == nil { // no account
            return 0
        }
        else {
            let count = ApiManager.sharedInstance.userService_currentUser!.arrayCurrencyAccounts.count
            return count
        }
    }

    var pickerViewHelp_rowWasChangedBeforeReloadingPicker = false

    var pickerViewHelp_dictOfViewsInPicker = [Int: UIView]()

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

        var pickerLabel = view as? UILabel;

        if (pickerLabel == nil)
        {
            pickerLabel = UILabel()
            pickerLabel?.textAlignment = NSTextAlignment.Center
        }
        pickerLabel?.attributedText = help_getAttributedStringForWalletByAmount(ApiManager.sharedInstance.userService_currentUser!.arrayCurrencyAccounts[row].balance, currency: EnumCurrency(rawValue: ApiManager.sharedInstance.userService_currentUser!.arrayCurrencyAccounts[row].currency), scaleOfText: 1)
        pickerViewHelp_dictOfViewsInPicker[row] = pickerLabel

        return pickerLabel!;
    }

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

    var pickerViewHelp_previouslySelectedRow = -1

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerViewHelp_previouslySelectedRow != row {
            pickerViewHelp_rowWasChangedBeforeReloadingPicker = true
        }
        else {
            pickerViewHelp_rowWasChangedBeforeReloadingPicker = false
        }
        pickerViewHelp_previouslySelectedRow = row
        pickerView.selectRow(row, inComponent: 0, animated: false) // because otherwise sometimes it stops between cells in the picker
        if pickerViewHelp_rowWasChangedBeforeReloadingPicker {
//            print("reload all components")
            pickerView.reloadAllComponents()
        }
        pickerViewHelp_afterRowWasSelected(row)
    }

It's not ideal either, but our designer liked it so we decided to use this way

Paul T.
  • 4,938
  • 7
  • 45
  • 93