2013-11-01 3 views
0

Не могу поверить, что я застрял на этом больше недели.iOS 7 - Подробный просмотр SplitViewController - Autolayout UITextView Изменение ориентации клавиатуры

Я видел (и пытался) каждый другой вопрос/ответ на этот вопрос, который я мог найти, и никто не работает.

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

Все, что мне нужно - это когда клавиатура отображается в текстовом режиме, либо изменит ее фрейм, либо содержимое содержимого вставки, так что клавиатура не покрывает ничего, и текст прокручивается до конца его текста, а любой новый набирать/переносить строки не скрывает клавиатура - простое право? Э ... нет.

Если пользователь изменяет Orientation (все поддерживаемые 4), то его необходимо настроить для размещения.

Затем с отклонением клавиатуры ему необходимо вернуться в полный размер (в зависимости от возможной новой ориентации).

Это первый проект, который я сделал с обоими Autolayout и iOS 7 (и я столкнулся с ошибкой в ​​iOS7, который ставит свою новую строку текста «ниже» в нижней части представления текста, но благодаря что теперь все в порядке.)

Однако НИКАКИЕ решения, которые я пробовал на этом сайте, не работают.

Я устанавливаю ограничения для UITextView, разместив его в IB в portrait и выбрав «сброс к предложенным ограничениям» - это кажется правильным для всех четырех ориентаций, если клавиатура не отображается.

ответ

1

Это можно сделать, настроив ограничение на нижнюю часть представления, когда клавиатура появляется и исчезает. В приведенном ниже примере у меня есть контроллер вида с панелью инструментов и текстовым представлением. Текстовое представление имеет ограничения (со значением 20) внизу и бокам основного вида, а одно - на панели инструментов в верхней части представления. У меня есть IBOutlet для ограничения в нижней части представления. Обратите внимание, что в методе keyboardWillShow: я должен проверить ориентацию вида, чтобы правильно определить значение константы ограничения - в ландшафтном режиме ширина и высота клавиатуры изменяются (то есть, что вы получаете как размер. ширина - это фактически высота, а размер. высота дает вам ширину).

@interface ViewController() 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomCon; // outlet to the constraint between the text view and the bottom of the view 
@property (weak,nonatomic) IBOutlet UITextView *tv; // outlet for the text view 
@end 

@implementation ViewController 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 



- (void)keyboardWillShow:(NSNotification*)aNotification { 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    if (self.view.bounds.size.width < self.view.bounds.size.height) { 
     self.bottomCon.constant = kbSize.height + 20; 
    }else{ 
     self.bottomCon.constant = kbSize.width + 20; 
    } 
} 


-(void)keyboardDidShow:(NSNotification *) aNotificaation { 
    [self.tv scrollRangeToVisible:NSMakeRange(self.tv.text.length - 1, 1)]; 
} 


- (void)keyboardWillHide:(NSNotification*)aNotification { 
    self.bottomCon.constant = 20; 
} 

-(IBAction)finishedEditing:(id)sender { // action for "Done" button on tool bar 
    [self.tv resignFirstResponder]; 
} 
+0

Благодарим вас за то, что нашли время, чтобы сделать код. Это ПОЛНОСТЬЮ работает .. В том, что в портрете - все в порядке. Если я затем перейду на Пейзаж - я получаю исключение - я попытался опубликовать его здесь, но раздел комментариев слишком ограничительный (и обрабатывает обратные нажатия новой строки ужасно) – iOSProgrammingIsFun

+0

Я добавил новый «ответ», показывающий сбой .. Это помогает выяснить, где я ошибаюсь? Почему это так сложно? Кто в Apple думает, что эта реализация была правильной идеей? – iOSProgrammingIsFun

+0

@iOSProgrammingIsFun, я получил эту ошибку, прежде чем я заметил, что высота и ширина были отменены, когда вы получаете размер клавиатуры - это ваш код точно так же, как и мой, потому что я тестировал мой портрет и пейзаж, и он отлично работает. Попробуйте ввести размер клавиатуры в методе keyboardWillShow и посмотреть, что он дает вам в портретной и альбомной ориентации. – rdelmar

0

Предлагаемый код, закрепленный выше, из невероятно полезного rdelmar прекрасно работает на портрете. Изменение в пейзаже однако производит этот крах:

Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x941da50 V:|-(158)-[UITextView:0x9926000] (Names: '|':UIView:0x9449a30)>", 
    "<NSLayoutConstraint:0x9449a00 V:[UITextView:0x9926000]-(1044)-| (Names: '|':UIView:0x9449a30)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x97b2d70 h=--& v=--& V:[UIView:0x9449a30(768)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x9449a00 V:[UITextView:0x9926000]-(1044)-| (Names: '|':UIView:0x9449a30)> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

Теперь я очищен КАЖДЫЙ ограничение с моей точки зрения детализации, и начал снова. UILabel, UIToolBar и UITextView имеют свои ведущие, конечные и верхние края PINNED.

UITextView также имел BOTTOM EDGE PINNED.

И это нижнее ограничение является тем, которое связано с IBOutlet, упомянутым в вышеприведенном сообщении.

Другие идеи, что не так?

0
CGSize kbSize  = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

if (kbSize.height < kbSize.width) 

Это было единственное изменение, которое требуется для ответа выше rdelmar. Спасибо! Это заставило меня с ума сойти на неделю !!!!

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