web-dev-qa-db-fra.com

Centrer le texte UIPickerView

Donc, j'ai un aperçu rapide avec des lignes qui ne contiennent que le nombre 0-24 et cela semble un peu ridicule puisque les chiffres sont alignés à gauche, ce qui laisse un énorme vide à droite de la sélection.

Existe-t-il un moyen simple de centrer le texte dans un aperçu uipick?

36
Msencenb
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 37)];
    label.text = [NSString stringWithFormat:@"something here"];
    label.textAlignment = NSTextAlignmentCenter; //Changed to NS as UI is deprecated.
    label.backgroundColor = [UIColor clearColor];
    [label autorelease];
    return label;
}

ou quelque chose comme ça.

67
Robin

Un peu plus facile maintenant dans iOS 6 ... Il existe une nouvelle méthode que vous pouvez implémenter pour renvoyer une chaîne attribuée ... Et vous pouvez définir un alignement dans des chaînes attribuées.

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString *text = [NSString stringWithFormat:@"R%d C%d", row, component];
    NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:text];
    NSMutableParagraphStyle *mutParaStyle=[[NSMutableParagraphStyle alloc] init];
    mutParaStyle.alignment = NSTextAlignmentCenter;
    [as addAttribute:NSParagraphStyleAttributeName value:mutParaStyle range:NSMakeRange(0,[text length])];
    return as;
}
21
James Boutcher

En dessous de celui qui fonctionne aussi très bien - 

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)];
    lbl.text = [reservePickerArray objectAtIndex:row];
    lbl.adjustsFontSizeToFitWidth = YES;
    lbl.textAlignment=UITextAlignmentCenter;
    lbl.font=[UIFont systemFontOfSize:20];
    return lbl;
}

À votre santé!!

4
Praveenkumar

Rappelez-vous, la vue dans 

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

est en fait une UITableViewCell, vous pouvez donc l'utiliser avec:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    static NSString *cellIdentifier = @"pickerViewCell";
    UITableViewCell *cell = (UITableViewCell*)view;

    if(cell==nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
        /** customize the cell **/
    }

    /** set the label **/
    cell.textLabel.text = [dataSource objectAtIndex:row];

    return cell;
}
3
Farhad Malekpour

Il suffit de définir la largeur à la largeur de la vue et le texte sera automatiquement centré:

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    return self.view.bounds.size.width; 
}
1
Ron Wood

Je sais que cette question n’est pas étiquetée pour Swift, mais si quelqu'un recherche la version 3.0 de Swift, la voici. 

/* Called by the picker view when it needs the view to use for a given row in    
 a given component. If the previously used view (the view parameter) is adequate,    
 return that. If you return a different view, the previously used view is     
released. The picker view centers the returned view in the rectangle for row.    

 */
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

    var label = UILabel(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(300), height: CGFloat(37)))


    let booking = self.bookingInfo[row]  //bookingInfo is an array of elements
      label.text = String(booking.BookingNumber) + String(booking.DateAndTime)
        label.textAlignment = .left
         return label
}
0
bibscy