Центр UIPickerView Текст - PullRequest
       43

Центр UIPickerView Текст

37 голосов
/ 18 февраля 2011

Итак, у меня есть uipickerview со строками, которые содержат только число от 0 до 24, и это выглядит немного глупо, так как числа выровнены по левому краю, оставляя огромный пробел справа от окна выбора.

Существует ли простой способ выравнивания текста по центру в представлении uipickerview?

Ответы [ 8 ]

67 голосов
/ 18 февраля 2011
- (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;
}

или что-то в этом роде.

22 голосов
/ 26 декабря 2012

Немного проще теперь в iOS 6 ... Есть новый метод, который вы можете реализовать, чтобы вернуть приписанную строку ... И вы можете определить выравнивание в приписанных строках.

- (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;
}
12 голосов
/ 18 февраля 2011

Вы можете реализовать этот метод делегата, который возвращает CGFloat

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component

Это вызывается в представлении выбора для определения ширины строки.

4 голосов
/ 29 декабря 2012

Под одним тоже работает нормально -

- (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;
}

Ура !!

3 голосов
/ 29 апреля 2012

Помните, вид в

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

на самом деле является UITableViewCell, поэтому вы можете работать с ним как:

- (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;
}
1 голос
/ 21 июня 2018

Просто установите ширину в ширину вида, и текст будет автоматически центрироваться:

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    return self.view.bounds.size.width; 
}
0 голосов
/ 26 июня 2019

Модернизированный Джеймс Бутчер для быстрого 5. Я предварительно вычисляю, пока OP делает атрибуцию непосредственно в attributeTitleForRow

    pickerData = pickerData.map {
        let ps = NSMutableParagraphStyle()
        ps.alignment = .center;

        let paraAttributes:[NSAttributedString.Key : Any] = [ NSAttributedString.Key.paragraphStyle: ps]

        let res = NSMutableAttributedString(attributedString: $0)
        res.addAttributes(paraAttributes, range: NSRange(location: 0, length: res.length))
        return res
    }
0 голосов
/ 31 декабря 2016

Я знаю, что этот вопрос не помечен для swift, но на тот случай, если кто-то ищет версию Swift 3.0, вот она.

/* 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
}
...