Personnalisation de UIPickerView (arrière-plan et de l'espacement)
Je voudrais changer le fond blanc dans un UIPickerView à une image de mon propre.
Est-ce possible?
Aussi, j'ai réussi à obtenir mon UIPickerView de défilement à l'horizontale au lieu de verticale. Maintenant, je voudrais savoir si il existe un moyen de régler l'espacement entre deux lignes de sélecteur de vue?
J'ai joint une image pour montrer ce que je veux dire.
C'est mon code:
- (void)viewDidLoad
{
[super viewDidLoad];
//Do any additional setup after loading the view from its nib.
arrayDays = [[NSMutableArray alloc] init];
[arrayDays addObject:@"ONSDAG"];
[arrayDays addObject:@"TORSDAG"];
[arrayDays addObject:@"FREDAG"];
[arrayDays addObject:@"LØRDAG"];
arrayDates = [[NSMutableArray alloc] init];
[arrayDates addObject:@"29. JUNI"];
[arrayDates addObject:@"30. JUNI"];
[arrayDates addObject:@"1. JULI"];
[arrayDates addObject:@"2. JULI"];
pickerViewDay = [[UIPickerView alloc] initWithFrame:CGRectZero];
[pickerViewDay setDelegate:self];
[pickerViewDay setShowsSelectionIndicator:NO];
CGAffineTransform rotate = CGAffineTransformMakeRotation(-M_PI/2);
rotate = CGAffineTransformScale(rotate, 0.25, 2.0);
[pickerViewDay setTransform:rotate];
[pickerViewDay setCenter:CGPointMake(self.view.frame.size.width/2, (pickerViewDay.frame.size.height/2)-3)];
[self.view addSubview:pickerViewDay];
//Adding selection indicator to pickerview
UIImage *selectorImage = [UIImage imageNamed:@"DayPickerView_SelectionIndicator.png"];
UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];
[customSelector setFrame:CGRectMake(0, 0, 120, 74)];
[customSelector setCenter:CGPointMake(self.view.frame.size.width/2, customSelector.frame.size.height/2)];
[self.view addSubview:customSelector];
[customSelector release];
//Adding background to pickerview
UIImage *backgroundImage = [UIImage imageNamed:@"DayPickerView_Background.png"];
UIView *custombackground = [[UIImageView alloc] initWithImage:backgroundImage];
[custombackground setFrame:CGRectMake(0, 0, 320, 74)];
//[self.view addSubview:custombackground];
[custombackground release];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
UIView *viewRow = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 80)];
CGAffineTransform rotate = CGAffineTransformMakeRotation(3.14/2);
rotate = CGAffineTransformScale(rotate, 0.25, 2.0);
//Date
CGRect rectDate = CGRectMake(30, 0, 150, 80);
UILabel *date = [[UILabel alloc]initWithFrame:rectDate];
[date setTransform:rotate];
[date setText:[arrayDates objectAtIndex:row]];
[date setFont:[UIFont fontWithName:@"Arial-BoldMT" size:37.0]];
[date setShadowColor:[UIColor whiteColor]];
[date setShadowOffset:CGSizeMake(0, -1)];
[date setTextAlignment:UITextAlignmentCenter];
[date setBackgroundColor:[UIColor clearColor]];
[date setClipsToBounds:YES];
[viewRow addSubview:date];
//Day
CGRect rectDay = CGRectMake(-30, 0, 150, 80);
UILabel *day = [[UILabel alloc]initWithFrame:rectDay];
[day setTransform:rotate];
[day setText:[arrayDays objectAtIndex:row]];
[day setFont:[UIFont fontWithName:@"Arial-BoldMT" size:21.0]];
[day setTextColor:[UIColor colorWithRed:0.35 green:0.35 blue:0.35 alpha:1]];
[day setTextAlignment:UITextAlignmentCenter];
[day setBackgroundColor:[UIColor clearColor]];
[day setClipsToBounds:YES];
[viewRow addSubview:day];
return viewRow;
}
- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [arrayDays objectAtIndex:row];
}
- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
return [arrayDays count];
}
EDIT 1
Pour RickiG (sur le fond):
EDIT 2
Pour RickiG:
Vous devez vous connecter pour publier un commentaire.
Hi
Il n'y a aucun moyen direct pour modifier l'arrière-plan. Ce que vous pouvez faire est d'avoir le point de vue que l'on retourne dans viewForRow fonction de son propre contexte (puis ajouter l'ombre de chaque côté par la suite si vous en avez besoin). Vous pouvez également aller à la recherche d'viewWithTag: mais ce n'est jamais une bonne idée car cela peut changer dans les futures versions du logiciel iOS.
Est-il une raison particulière vous mettre en œuvre à la fois viewForRow et TitleForRow? J'ai l'habitude de simplement remplir le viewForRow étiquettes à l'intérieur de cette méthode du délégué.
La viewForRow a la possibilité de réutiliser les points de vue dans le Sélecteur, un peu comme un UITableView vous devez tester si le "reusingView:(UIView *)voir" est nul et si pas il n'y a pas besoin de tirer à nouveau le tout. Juste remplir les étiquettes.
J'ai l'habitude de ne jamais personnaliser le sélecteur, si j'ai besoin de quelque chose de complètement ne pas coutume, je sous-classe de la UITableView, il est beaucoup plus flexible et peut de ce que le Sélecteur n' + plus.
Pour l'espacement, vous pouvez utiliser la "hauteur" des lignes, le sélecteur de centre le point de vue que l'on retourne dans viewForRow, alors assurez-vous juste:
renvoie une valeur plus grande que votre point de vue.
Tenue og lykke;)
Je viens de comprendre comment appliquer la couleur d'arrière-plan ou de l'image dans le sélecteur de vue. Espérons qu'il peut aider quelqu'un.
Il suffit de définir une catégorie dans le fichier où vous voulez vous sélecteur de vue comme suit:
Vous pouvez aller au-delà de
subviews
pour plus de personnalisation.Dirait que c'est un vieux thread, mais dans iOS 7 (peut-être plus tôt, je ne suis pas sûr), UIPickerViews ont une couleur d'arrière-plan de la propriété, de sorte que le réglage de la couleur d'arrière-plan est simple:
[pickerView setBackgroundColor:[UIColor whiteColor]];
Définition d'une image d'arrière-plan est aussi simple grâce à [UIColor colorWithPatternImage:]. (Notez que le motif en mosaïque si l'image est plus petite que la UIPickerView.)
De modifier le composant largeurs que vous pouvez mettre en œuvre la méthode du délégué widthForComponent, afin de définir des largeurs différentes pour chaque composant. En théorie, vous devriez être en mesure d'ajouter un élément vide et il est vide largeur de créer un espacement, mais je n'ai pas essayé ce.
Je n'ai pas été en mesure de trouver un moyen de changer l'espacement entre les composants, ce qui semble être une jolie manière de modifier l'espacement et serait également vous permet de supprimer les ~5 px espacement entre les composants, mais si je suis en mesure de trouver celui que je vais mettre à jour ma réponse.
Que diriez-vous d'une vue vide sur la droite de vos étiquettes? Et pour l'arrière plan, vous devriez probablement utiliser
insertSubview:aboveView:
méthode avec l'arrière-plan par défaut est le deuxième paramètre (si vous pouvez y accéder).