Я'м пытаясь добиться похожего поведения позиционирование как текст внизу строке ввода Яблоко'ы приложение Сообщения.
Я пробовал много подходов, искали высокое и низкое, и есть много подобных вопросов, но ни один не был удовлетворительным.
Указать:
Предлагаемые решения:
Данное решение не отвечает особый случай второе требование (панель инструментов, чтобы следовать клавиатура как клавиатура появляется и исчезает):
UIScrollViewKeyboardDismissMode
был введен. Это позволяет интерактивный жест закрывая клавиатуру. Как пользователь пролистывает мимо верхнего края клавиатуры, клавиатуры рама постепенно вытекает. Это решение не делает ничего, чтобы разместить такое поведение и остается только панель инструментов, Котор сели на мель на это'ы анимированные позицию.Кроме того, это решение также не выполняет особый случай третье требование (панели должны остаться на верхней части клавиатуры, когда клавиатура видимая):
Еще одна проблема с этим решением:
Следующий предлагаемое решение:
UIResponder
'inputAccessoryView ы ``Данное решение представляется как Apple, предназначенный для поддержки такого поведения, так как он решает все недостатки вручную анимации панели инструментов. Но это решение совершенно не попадает в четвертое требование (когда клавиатура скрыта, панель инструментов остается (на"стыковка") смотрите в нижней части представления).
Похоже, решение заключается в использовании UIResponder
'ы inputAccessoryView
, но почему-то делает inputAccessoryView
не двигайся ниже смотреть. Я'м ищу чистый код, чтобы достичь этого. Есть сложные, почти благородным, попытки в другом месте, но как уже упоминалось, они не отвечают требованиям.
В моем конкретном случае, я ищу, чтобы использовать UINavigationController'панель инструментов с, что влечет за собой дополнительные проблемы, так как это не обычное поведение для
UINavigationController`. Неважно, я'м готов представить несколько суховато исправления для этого.
Я просто показал, что "в" решение Джейсон прораб (@threeve). На геймпаде вид (да, вид контроллера) добавить inputAccessoryView:
и вернуть вид, который вы хотите закрепить в нижней части и двигаться с клавиатуры. Он просто работает. На вид не'т на самом деле должны быть в вашей иерархии представления, он будет вставлен в контроллер автоматически.
редактировать: также реализовать canBecomeFirstResponder и возврата да (как заметил Макс Seelemann). reloadInputViews может быть слишком удобно.
Джонатан Badeen'с вышеупомянутыми Решение работал на меня. Здесь's код из Арик показывает, как это реализовать (для этого надо зайти в соответствующий контроллер вид):
- (BOOL)canBecomeFirstResponder{
return YES;
}
- (UIView *)inputAccessoryView{
return self.inputAccessoryToolbar;
// where inputAccessoryToolbar is your keyboard accessory view
}
Для тех, кто ищет стремительный версия:
Подключите панель инструментов (в моем случае 'myToolBar
') на ваш контроллер представления. Затем переопределить метод canBecomeFirstResponder и переопределить геттер inputAccessoryView
переменной. Также Дон'т забудьте добавить "я".myToolBar.removeFromSuperview () или еще в Xcode будет жаловаться.
class ViewController: UIViewController {
@IBOutlet var myToolBar: UIToolbar!
override func canBecomeFirstResponder() -> Bool {
return true
}
override var inputAccessoryView:UIView{
get{
return self.myToolBar
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.myToolBar.removeFromSuperview()
}
}
Там's превосходный, простой в использовании, с открытым исходным кодом решение от хороших людей на слабину: SlackTextViewController.
Здесь's, как реализовать просмотр с пристыкованной панели инструментов в четыре шага:
, который наследует от
SLKTextViewController`, не нужно писать больше кода, чем это:импорт фундамент импорт базе UIKit
MessageViewController класс: SLKTextViewController {
требуется инит(кодер aDecoder: NSCoder!) { супер.инит(кодер: aDecoder) } }
Реквизит для команды в слабину для получения такого полезного модуля.
Так что я знаю, это старый пост, и я не уверен, что если вы решили это или нет, но я нашел способ, чтобы получить эту работу. Я считаю, что есть ошибка в inputAccessoryView, но я создал решение суховато вести себя так, как приложение сообщений. Я думаю, что я предоставил весь необходимый код для осуществления работы по. Я собираюсь попробовать и сделать более подходящий пост в блоге, созданные когда-нибудь в ближайшем будущем, более глубокое описание с моими выводами. Любые вопросы, дайте мне знать.
@property(nonatomic,assign)BOOL isFirstKeyboard; //workaround for keyboard bug
@property(nonatomic,assign)BOOL isViewAppear;
@property(nonatomic,strong)ChatBarView *chatView; //custom chat bar view
@property(nonatomic,strong)UIView *footerPadView; //just to add some nice padding
////////////////////////////////////////////////////////////////////////////////////////////////////
//in the view did load
- (void)viewDidLoad
{
//more app specific code...
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
self.chatView.textView.inputAccessoryView = self.chatView;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
-(void)done
{
self.isFirstKeyboard = YES;
[self.chatView.textView becomeFirstResponder];
}
////////////////////////////////////////////////////////////////////////////////////////////////////
- (void) moveTextViewForKeyboard:(NSNotification*)aNotification up:(BOOL)up
{
if(!self.isViewAppear)
return;
//NSLog(@"keyboard is: %@", up ? @"UP" : @"Down");
if(!up && !self.isFirstKeyboard)
[self performSelector:@selector(done) withObject:nil afterDelay:0.01];
else if(!up & self.isFirstKeyboard)
{
self.isFirstKeyboard = NO;
[self.view addSubview:self.chatView];
CGRect frame = self.chatView.frame;
frame.origin.y = self.view.frame.size.height - self.chatView.frame.size.height;
self.chatView.frame = frame;
}
else
{
NSDictionary* userInfo = [aNotification userInfo];
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
// Animate up or down
[UIView beginAnimations:nil context:nil];
if(up)
[UIView setAnimationDuration:0.2];
else
[UIView setAnimationDuration:0.3];
[UIView setAnimationCurve:animationCurve];
CGRect frame = self.footerPadView.frame;
CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];
if (up)
frame.size.height = keyboardFrame.size.height - self.chatView.frame.size.height;
else
frame.size.height = 0;
self.footerPadView.frame = frame;
self.tableView.tableFooterView = self.footerPadView;
[UIView commitAnimations];
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardWillShow:(NSNotification *)aNotification {
[self moveTextViewForKeyboard:aNotification up:YES];
}
////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardWillHide:(NSNotification *)aNotification
{
[self moveTextViewForKeyboard:aNotification up:NO];
}
////////////////////////////////////////////////////////////////////////////////////////////////////