Центр Текст UIPickerView
Итак, у меня есть uipickerview с строками, которые содержат только число 0-24, и это выглядит немного глупо, поскольку числа выровнены по левому краю, оставляя огромный пробел справа от pickerview.
Есть ли простой способ центрировать выравнивание текста в uipickerview?
Ответы
Ответ 1
- (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;
}
или что-то вроде этого.
Ответ 2
Немного легче теперь в 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;
}
Ответ 3
Вы можете реализовать этот метод делегата, который возвращает CGFloat
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
Это вызвано в представлении выбора, чтобы определить ширину строки.
Ответ 4
Ниже также хорошо работает -
- (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;
}
Ура!!
Ответ 5
Отсутствие свойства сборщика, имеющего установленную возможность выравнивания.
поэтому для этого вам нужен жесткий код.
см. этот код
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component
{
return 25;
}
- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSString *title=[NSString stringWithFormat:@" %i",row];//here you give extra spaces.
return title;
}
Ответ 6
Помните, что вид в
- (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;
}
Ответ 7
Просто установите ширину в ширину вида, и текст будет автоматически центрироваться:
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
return self.view.bounds.size.width;
}
Ответ 8
Я знаю, что этот вопрос не помечен для 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
}
Ответ 9
Модернизировал Джеймса Бутчера до Swift 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
}