web-dev-qa-db-fra.com

IOS7 UIPickerView comment masquer l'indicateur de sélection

Comment masquer ces 2 lignes sur la ligne sélectionnée?

enter image description here

33
james075
[[pickerview.subviews objectAtIndex:1] setHidden:TRUE];
[[pickerview.subviews objectAtIndex:2] setHidden:TRUE];

Utilisez ceci dans la méthode de délégué titleForRow ou viewForRow de la pickerView.

34
motox

Sur la base des autres réponses, j'ai décidé d'énumérer les sous-vues et de constater que les lignes ont une hauteur de 0.5. Ma solution ressemble donc à ceci dans Swift:

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

     pickerView.subviews.forEach({

          $0.hidden = $0.frame.height < 1.0
     })

     return myRowCount
}

Et en Objective-C

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {

     [pickerView.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop) {

        subview.hidden = (CGRectGetHeight(subview.frame) < 1.0) 
     }];

    return myRowCount
}

Évidemment pas particulièrement futuriste, mais probablement plus que de cacher une sous-vue à un index donné.

Edit: Mise à jour pour traiter le cas fourni par @Loris

23
ChrisH

Dans iOS7, la définition du paramètre pickerview.showsSelectionIndicator n'a aucun effet, selon la documentation ( https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UIPickerView.html ).

Cependant, comme UIPickerView est à la fin un UIView avec des sous-vues, j'ai vérifié quelles sous-vues il y avait. J'ai trouvé 3, le premier contient tous les composants de UIPickerView, et les deux autres sont les deux lignes. 

Donc, en définissant les deuxième et troisième (index 1 et 2) masqués, les deux lignes ont été supprimées.

[[pickerview.subviews objectAtIndex:1] setHidden:TRUE];
[[pickerview.subviews objectAtIndex:2] setHidden:TRUE];

Ce n'est pas une vraie solution de Nice, et certainement pas compatible en aval, mais pour l'instant, le travail est fait. J'espère que cela t'aides.

11
morksinaanab

Cela a fonctionné pour moi dans Swift dans iOS 9 Beta.

datePicker.subviews[0].subviews[1].hidden = true
datePicker.subviews[0].subviews[2].hidden = true
8
Justin Domnitz

Swift 3 Version (en fonctionnement):

pickerView.subviews[1].isHidden = true
pickerView.subviews[2].isHidden = true
5
ofeida

Cela fonctionne avant iOS 7.

pickerView.showsSelectionIndicator = NO;

pour plus d'infos sur ios7 voir cette doc

https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UIPickerView.html

4
Dharmbir Singh
func numberOfComponents(in pickerView: UIPickerView) -> Int
    {
        pickerView.subviews.forEach({
            $0.isHidden = $0.frame.height < 1.0
        })
        return 1
    }
4
Larry Feldman

J'ai résolu ce problème par une astuce simple: Placez la vue sélecteur dans une vue et définissez la propriété subversion de clip de cette vue = true . Maintenant, définissez simplement la hauteur de la ligne dans la vue sélecteur = hauteur de la vue conteneur, puis la ligne disparaîtra.

3
Son Nguyen

Ceci est facilement réalisé. Placez simplement votre PickerView dans un ScrollView avec la taille souhaitée de votre ligne et utilisez la méthode du délégué de sélecteur (pickerView: rowHeightForComponent :) pour modifier la hauteur de la rangée du sélecteur à une taille légèrement supérieure à votre ScrollView. Comme ça, les lignes seront cachées.

3
HeavenlyManBR

Swift 4.2

Collez les deux lignes de code dans votre méthode de délégation titleForRow ou viewForRow du pickerView.

pickerView.subviews[1].isHidden = true
pickerView.subviews[2].isHidden = true

Et vous devriez être prêt à partir.

1
Douglas Putnam

Il suffit d'écrire ce code dans votre méthode viewdidload

[[PickerView.subviews objectAtIndex:1] setHidden:TRUE];
[[PickerView.subviews objectAtIndex:2] setHidden:TRUE];
0
BHASKAR

Dans iOS 7, nous ne pouvons pas masquer la ligne distincte dans UIPickerView Nous pouvons le savoir grâce à cette page: https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIPickerView_Class /index.html#//Apple_ref/occ/instm/UIPickerView/showsSelectionIndicator

Mais nous pouvons ajouter deux UIViews pour le couvrir et la largeur de deux UIViews est 1 . Quelques exemples de code ici:

s_leftLine = [[UIView alloc] initWithFrame:CGRectMake(s_pickerView.frame.size.height/2,
                                                      s_pickerView.frame.size.width/2 - kWidthOfPickerPage/2 + 1,
                                                      1,
                                                      s_pickerView.frame.size.height)];
s_leftLine.backgroundColor = [UIColor whiteColor];
s_leftLine.layer.zPosition = s_pickerView.layer.zPosition + 1; // make sure the line is on the top
[s_pickerView addSubview:s_leftLine];

Ok, ce sera beaucoup mieux:] Si quelqu'un a une meilleure réponse, il suffit de l'écrire pour le partager :)

0
NSKevin

Vous pouvez également créer une extension pour UIPickerView:

extension UIPickerView {
    func hideSelectionIndicator() {
        for i in [1, 2] {
            self.subviews[i].isHidden = true
        }
    }
}

Ensuite, appelez simplement myPickerView.hideSelectionIndicator() pour chaque PickerView que vous souhaitez modifier.

0
Jan-Willem

J'ai opté pour une approche différente afin de le rendre un peu plus évolutif au cas où Apple déciderait de changer quelque chose.

for subview in setPickerView.subviews{
    if subview.frame.Origin.y != 0{
        subview.isHidden = true
    }
}

étant donné que l'emplacement de l'origine et de l'élément (la sous-vue qui contient les éléments) est 0, je peux alors masquer quoi que ce soit en toute sécurité sans risquer d'index hors erreur

Prendre plaisir

EDIT: J'ai oublié de vous dire que je l'ai mis dans la méthode viewDidLayoutSubviews!

0
DatForis