У моего UIPickerView такое же поведение, как у клавиатуры - PullRequest
3 голосов
/ 27 мая 2010

Итак, у меня есть UITableView, где одна из его строк является UITextView.

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

Когда пользователь выбирает другую ячейку, появляется DatePicker, и пользователь может выбрать данную дату. Я хочу, чтобы пользователь мог прокручивать tableView так же, как когда клавиатура находится на экране.

Проблема здесь в том, что когда я прокручиваю с помощью сборщика, стол отскакивает к предыдущей позиции (с некоторыми ячейками, скрытыми сборщиком).

Я предполагаю, что это происходит потому, что я добавляю средство выбора в главное окно в качестве подпредставления ... но я, честно говоря, не уверен ...

Где (и как) я должен добавить свой сборщик, чтобы он "появлялся" там, где появляется клавиатура?

Не уверен, что мне ясно ...

Большое спасибо.

Ответы [ 4 ]

11 голосов
/ 11 сентября 2010

Вы должны использовать свойство inputView класса UIResponder (также класса UITextField). Просто сделай:

UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
//picker.delegate = self;
//picker.dataSource = self;
//[picker setShowsSelectionIndicator:YES];
textField.inputView = picker;
[picker release];

и UIPickerView будет вести себя как вид клавиатуры.

Подробнее и пример кода см. В моей статье о работе со сборщиками .

0 голосов
/ 13 января 2012

Как указывает lechec, просто установите для свойства inputView объекта UITextField значение UIPickerView. Это очень легко сделать.

В этом посте подробно рассказывается о том, как это сделать: http://nomtek.com/tips-for-developers/working-with-pickers/, и имеется проект для загрузки с примером кода. Проект открывается нормально в XCode 4.2 и компилируется для iOS 5.

Кроме того, я не хотел вставлять кнопку, чтобы скрыть это. Следующий код позволяет пользователю коснуться любого места в представлении, вне UITextField, и оставить его в качестве первого респондента, в результате чего он «теряет фокус». На самом деле код для обработки жеста касания приводит к тому, что любой UITextField «теряет фокус», тем самым скрывая любой inputView или клавиатуру.

-(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture
{
    [self endEditing:YES];
}

Это реализовано в ViewController. Обработчик добавляется как распознаватель жестов к соответствующему представлению в установщике свойства представления:

-(void) setLoginView:(LoginView *)loginView
{
    _loginView = loginView;

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];    

    [tapRecognizer setDelegate:self];  // self implements the UIGestureRecognizerDelegate protocol

    [self.loginView addGestureRecognizer:tapRecognizer];    
}

Обработчик также может быть определен в представлении. Если вы не знакомы с обработкой жестов, см. Документы Apple и / или тонны образцов в других местах.

Я должен упомянуть, что вам понадобится некоторый дополнительный код, чтобы убедиться, что другие элементы управления получают ответвления, вам нужен делегат, реализующий протокол UIGestureRecognizerDelegate, и этот метод:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{    
    if ([touch.view isKindOfClass:[UIButton class]])    // Customize appropriately.
        return NO; // Don't let the custom gestureRecognizer handle the touch   

    return YES;
}
0 голосов
/ 28 мая 2010

Не так элегантно ...

Не так про ...

Я сделал это ...

CGRect frame3 = self.tableView.frame;
frame3.size.height = frame3.size.height-216;
self.tableView.frame = frame3;

а потом я заставил свой сборщик появиться. И вуаля! ;)

0 голосов
/ 28 мая 2010

Я фактически сделал это с помощью UIDatePicker, создал свой собственный SlideUpDatePicker, который анимировался снизу, как клавиатура. Мне потребовалась неделя или две, чтобы все это работало идеально, было определенно непросто заставить его работать в портретной и альбомной ориентации и с навигационным контроллером и его анимацией.

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

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

Если вы используете функцию dumpWindows () , вы можете увидеть иерархию UIWindow и UIView с клавиатурой и табличным представлением в приложении на основе навигации:

dumpView: <UIWindow: 0x411fd50; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x4120af0>>                                                                                                                                                                                                                                                                                                                                                                                 
dumpView: : <UILayoutContainerView: 0x4123310; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x411f800>>                                                                                                                                                                                                                                                                                                                                                                                 
dumpView: : | <UINavigationTransitionView: 0x4123500; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x41232e0>>                                                                                                                                                                                                                                                                                                                                                     
dumpView: : | : <UIViewControllerWrapperView: 0x4519d30; frame = (0 64; 320 416); autoresize = W+H; layer = <CALayer: 0x4519a40>>                                                                                                                                                                                                                                                                                                                                                                      
dumpView: : | : | <UITableView: 0x7808000; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x45182a0>>                                                                                                                                                                                                                                                                                                                                                                
dumpView: : | : | : <DeleteCell: 0x45196e0; baseClass = UITableViewCell; frame = (0 507; 320 45); opaque = NO; autoresize = W; layer = <CALayer: 0x4519a80>>                                                                                                                                                                                                                                                                                                                                           
dumpView: : | : | : <TextCell: 0x4523280; baseClass = UITableViewCell; frame = (0 442; 320 45); autoresize = W; layer = <CALayer: 0x4521ed0>>                                                                                                                                                                                                                                                                                                                                                          
dumpView: : | : | : <DatePickerCell: 0x45224b0; baseClass = UITableViewCell; frame = (0 398; 320 44); autoresize = W; layer = <CALayer: 0x451e170>>                                                                                                                                                                                                                                                                                                                                                    
dumpView: : | : | : <ButtonCell: 0x4521680; baseClass = UITableViewCell; frame = (0 354; 320 44); autoresize = W; layer = <CALayer: 0x4521750>>                                                                                                                                                                                                                                                                                                                                                        
dumpView: : | : | : <ButtonCell: 0x45209f0; baseClass = UITableViewCell; frame = (0 310; 320 44); autoresize = W; layer = <CALayer: 0x4520ac0>>                                                                                                                                                                                                                                                                                                                                                        
dumpView: : | : | : <ButtonCell: 0x4520100; baseClass = UITableViewCell; frame = (0 266; 320 44); autoresize = W; layer = <CALayer: 0x45201d0>>                                                                                                                                                                                                                                                                                                                                                        
dumpView: : | <UINavigationBar: 0x45018b0; frame = (0 20; 320 44); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x4500fe0>>                                                                                                                                                                                                                                                                                                                                                                  
dumpView: : | : <UINavigationItemView: 0x4522a20; frame = (100 8; 160 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4526310>>                                                                                                                                                                                                                                                                                                                                                     
dumpView: : | : <UINavigationItemButtonView: 0x45230a0; frame = (5 7; 87 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4520260>>                                                                                                                                                                                                                                                                                                                                                  
dumpView: <UITextEffectsWindow: 0x4537080; frame = (0 0; 320 480); opaque = NO; layer = <CALayer: 0x45371c0>>                                                                                                                                                                                                                                                                                                                                                                                          
dumpView: : <UIKeyboard: 0x4536ce0; frame = (0 264; 320 216); opaque = NO; layer = <CALayer: 0x4536f60>>                                                                                                                                                                                                                                                                                                                                                                                               
dumpView: : | <UIKeyboardImpl: 0x4175b10; frame = (0 0; 320 216); opaque = NO; layer = <CALayer: 0x4173f90>>                                                                                                                                                                                                                                                                                                                                                                                           
dumpView: : | : <UIKeyboardLayoutStar: 0x4177d90; frame = (0 0; 320 216); layer = <CALayer: 0x4177610>>                                                                                                                                                                                                                                                                                                                                                                                                
dumpView: : | : | <UIKBKeyplaneView: 0x418a6a0; frame = (0 0; 320 216); userInteractionEnabled = NO; layer = <CALayer: 0x418a750>>                                                                                                                                                                                                                                                                                                                                                                     
dumpView: : | : | : <UIKBKeyView: 0x41748e0; frame = (1 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x41545c0>>                                                                                                                                                                                                                                                                                                                                                           
dumpView: : | : | : <UIKBKeyView: 0x417e2d0; frame = (279 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x417df10>>                                                                                                                                                                                                                                                                                                                                                         
dumpView: : | : | : <UIKBKeyView: 0x418a780; frame = (1 173; 78 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x417f990>>                                                                                                                                                                                                                                                                                                                                                           
dumpView: : | : | : <UIKBKeyView: 0x418adf0; frame = (81 173; 158 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4180120>>                                                                                                                                                                                                                                                                                                                                                         
dumpView: : | : | : <UIKBKeyView: 0x418cdb0; frame = (241 173; 78 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x418cf20>>                    
...