0

Я пытаюсь создать UIPicker, где я могу выбрать минуты и секунды. Вот код:UIPickerView - удалить кривизну и добавить текст

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 2; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if(component == 0) 
     return 24; 

    return 60; 
} 

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component 
{ 
    return 30; 
} 

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
    [paragraphStyle setAlignment:NSTextAlignmentCenter]; 
    [paragraphStyle setTailIndent:20]; 

    NSString *value = [NSString stringWithFormat:@"%d", row]; 

    return [[NSAttributedString alloc] initWithString:value 
              attributes:@{NSParagraphStyleAttributeName:paragraphStyle}]; 
} 

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component 
{ 
    return 160; 
} 

Как я могу избавиться от раздражающих кривизны и просто сделать вертикальные столбцы?

Также, как добавить «мин» и «сек» в строку выбора?

picker

+1

Вы можете использовать UIDatePicker и сами устранить эту проблему. – ZeMoon

+0

AFAIK Вы не можете делать минуты и секунды с помощью UIDatePicker. – soleil

+1

Думаю, вам придется создавать свои собственные, если вы не хотите кривизны. Простое использование двух узких табличных представлений. Вам нужно будет добавить код в методах делегата прокрутки, чтобы автоматически выбирать значение при прокрутке. – rdelmar

ответ

0

Поскольку вы делаете его на 24 минут и 60 секунд, я бы подделкой его с датой 24h подборщика. IMO

Как я могу избавиться от раздражающей кривизны и просто сделать вертикальные столбцы?

У вас нет. Else, реализуйте свои собственные, используя 2 вида таблиц или что-то в этом роде.

Также, как добавить «мин» и «сек» в строку выбора?

NSString *value; 

if(component == 0) value = [NSString stringWithFormat:@"%d min", row]; 
else value = [NSString stringWithFormat:@"%d sec", row]; 
+0

Этот код добавляет «мин» и «сек» в ВСЕ строки. Я просто хочу, чтобы средняя «выбранная» строка отображала текст «min» и «sec». – soleil

+0

И что касается фальсификации его с помощью 24-х годов, это не представляется возможным, так как мне нужно отображать минуты и секунды, а не часы и минуты. – soleil

+0

24-й выбор даты просто показывает номера (проверяет приложение будильника, убедитесь, что вы установили устройство на 24 часа). и если вы хотите один минус и секунду, сделайте 4 компонента для сборщика и верните «мин» и «сек» для компонентов 1 и 3 соответственно и верните 1 строку для обоих из них. – soemarko

0

Как уже говорили другие, существующие API не может это сделать. Если вы хотите это сделать, вам придется написать свой собственный код, чтобы сделать это. В прошлом я создал горизонтальный сборщик ценностей, и это было раздражающим, но довольно прямолинейным. Для этого я использовал UILabel, изображение и UIScrollView.

Сначала настроить интерфейс

  1. Возьмите этикетку и вставить его в окне прокрутки. Заполните метки необходимыми значениями.
  2. Установите высоту, ширину и положение прокрутки, чтобы показать, что вы хотите видеть. Если вы хотите, чтобы пользователь увидел выбранный элемент и 3 сверху и 3 внизу, сделайте его достаточно большим, чтобы показать 7 строк на этикетке.
  3. Вы являетесь «индикатором выбора», который вы накладываете поверх этого элемента в виде прокрутки, чтобы показать пользователю, что это выбранный элемент.
  4. Если вы хотите, чтобы эффект значительного эффекта исчезновения, так как ваши значения исчезли, вы можете создать белый (или любой другой фон вашего приложения) блок, который исчезает до прозрачного и накладываемого над верхней и нижней частью прокрутки. Это создает эффект уменьшения замирания на краях компонента.

Визуально он показывает работу ... по большей части, но нам нужен задний конец кода для его поддержки.

  1. Создать UIScrollViewDelegate и реализовать scrollViewDidScroll:, который расскажет вам содержание смещения вашей точки зрения прокрутки, когда пользователи изменяют его.
  2. Напишите способ, который преобразует смещение содержимого прокрутки, для которого был выбран «элемент». Если вы знаете, сколько строк находится на ярлыке (и вам нужно), и вы знаете, насколько высока метка (и вы должны) взять высоту/строку метки, чтобы узнать, насколько высок каждый «элемент». Затем вы принимаете смещение контента, делите на высоту элемента, надели его и знаете, в какой строке вы находитесь ... при сохранении смещения содержимого от TOP вашего вида прокрутки, поэтому добавьте половину высоты.:)

Итак, основная функциональность выполнена, и она работает, но она некрасивая.

Выбранный элемент не был центрирован в моем изображении выбора, которое просто визуально уродливо. Но вы можете исправить это достаточно легко. Вы знаете высоту элементов в списке, и вы знаете, какой элемент выбран, поэтому программно прокрутите колесо, чтобы этот элемент был центрирован.

Другой вопрос, который у меня был, был импульсом. Как настоящий колесо, я хотел, чтобы у моего сборщика был момент, поэтому, если бы ты дал ему тяжелый флип, это пошло бы на некоторое время, но если бы ты дал ему нежный фильм, это остановилось бы довольно быстро. У меня был длинный список, и если люди собирались с 7 до 70 лет, я хотел, чтобы они могли сделать это легко. Если вас это интересует, я могу показать вам, как я это сделал, и опубликовать код, когда я вернусь к машине с моим кодом.

+0

У вас есть код для обмена, это очень поможет. – user1046037

Смежные вопросы