Domanda

Sto avendo un UIPicker, voglio cambiare il colore del selettore. E 'possibile cambiare il colore del selettore?

È stato utile?

Soluzione

Credo che hai a che fare con l'iPhone SDK? Ci possono essere alcuni altri framework che utilizza questo nome, quindi forse è possibile aggiungere i tag per includere UIKit, cacao-touch o qualcosa del genere.

In ogni caso, è possibile impostare showsSelectionIndicator dell'istanza UIPickerView su NO, in modo che nasconde il selettore. Quindi è possibile creare una nuova vista con lo stile di selezione rettificato, e aggiungerlo alla superview sopra l'UIPickerView.

// Some sample code, but you can do this in IB if you want to
_pickerView = [[UIPickerView alloc] init];
_pickerView.showsSelectionIndicator = NO;
[_pickerView sizeToFit];
[self.view addSubview:_pickerView];

UIImage *selectorImage = [UIImage imageNamed:@"selectorImage.png"]; // You have to make it strechable, probably
UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];
customSelector.frame = CGRectZero; // Whatever rect to match the UIImagePicker
[self.view addSubview:customSelector];
[customSelector release];

Hacking l'interfaccia utente elemento stesso ci vorrà molto più lavoro, e questo deve lavorare pure.

Altri suggerimenti

Forse non è adatta completamente per rispondere a questa domanda, in iOS 7 e versioni successive è possibile personalizzare il colore in questo modo:

Nei metodi delegato

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

aggiungere seguente

[[pickerView.subviews objectAtIndex:1] setBackgroundColor:NEEDED_COLOR];
[[pickerView.subviews objectAtIndex:2] setBackgroundColor:NEEDED_COLOR];

Aggiorna

codice precedente funziona, ma così così. Qui semplici sottoclassi per UIPickerView

Swift:

class RDPickerView: UIPickerView
{
    @IBInspectable var selectorColor: UIColor? = nil

    override func didAddSubview(subview: UIView) {
        super.didAddSubview(subview)
        if let color = selectorColor
        {
            if subview.bounds.height <= 1.0
            {
                subview.backgroundColor = color
            }
        }

    }
}

Objective-C:

@interface RDPickerView : UIPickerView

@property (strong, nonatomic) IBInspectable UIColor *selectorColor;

@end

@implementation RDPickerView

- (void)didAddSubview:(UIView *)subview
{
    [subview didAddSubview:subview];
    if (self.selectorColor)
    {
        if (subview.bounds.size.height <= 1.0)
        {
            subview.backgroundColor = self.selectorColor;
        }
    }
}

@end

ed è possibile impostare il colore di selezione direttamente nella storyboard

Grazie a Ross Barbish - "Con iOS 9.2 e XCode 7.2 rilasciato 2015/12/08, l'altezza di questa visione selezione è ,666666666666667"

.

UPDATE:

E 'per risolvere problema con iOS 10, non va bene, ma opere. : /

class RDPickerView: UIPickerView
{
    @IBInspectable var selectorColor: UIColor? = nil

    override func didAddSubview(_ subview: UIView) {
        super.didAddSubview(subview)

        guard let color = selectorColor else {
            return
        }

        if subview.bounds.height <= 1.0
        {
            subview.backgroundColor = color
        }
    }

    override func didMoveToWindow() {
        super.didMoveToWindow()

        guard let color = selectorColor else {
            return
        }

        for subview in subviews {
            if subview.bounds.height <= 1.0
            {
                subview.backgroundColor = color
            }
        }
    }
}

Grazie Dmitry Klochkov, cercherò di trovare qualche soluzione migliore.

Ecco un miglioramento alla risposta di vsilux, sotto forma di una semplice categoria di UIPickerView, senza la necessità di creare una sottoclasse UIPickerView.

(Up-to-date di risposta come 2 Novembre 2018)

Swift 4, Xcode 10:

@IBInspectable var selectorColor: UIColor? {
    get {
        return objc_getAssociatedObject(self, &selectorColorAssociationKey) as? UIColor
    }
    set(newValue) {
        objc_setAssociatedObject(self, &selectorColorAssociationKey, newValue,
                                 objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    }
}

open override func didAddSubview(_ subview: UIView) {

    super.didAddSubview(subview)
    if let color = selectorColor {
        if subview.bounds.height < 1.0 {
            subview.backgroundColor = color
        }
    }
}

È possibile modificare solo la colore di sfondo indicatore di selezione pure.
Basta aggiungere un UIView sopra l'indicatore di selezione (che diventerà la visualizzazione overlay), impostare è valore alfa bassa (dipende da voi, ma mi piace il mio sovrapposizione di guardare trasparente) , dargli un colore di sfondo e siete a posto.

Considerate questo,

var overlayOnPicker:UIView = UIView(frame: CGRectMake(1, 68, mypicker.frame.width, 26))
// Adds a layer on the selection indicator

E mettere la valore X di CGRect = 1     (Ricordate, è un telaio, in modo che venga posizionato secondo il sistema di coordinate della superview)

overlayOnPicker.backgroundColor = UIColor.whiteColor()
overlayOnPicker.alpha = 0.2
myDatePicker.addSubview(overlayOnPicker)
// You have to add the overlayOnPicker view as a subview to the Date Picker.
// myDatePicker is the UIDatePicker that I declared earlier in my code
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top