2013-04-11 3 views
0

У меня есть UITextView, на котором я использую NSLayoutConstraint, чтобы уклониться от клавиатуры. Вот ограничение:Использование NSLayoutConstraint в UITextView сбрасывает contentSize в {0,0}

self.textViewBottomConstraint = [NSLayoutConstraint constraintWithItem:textView 
                attribute:NSLayoutAttributeBottom 
                relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                attribute:NSLayoutAttributeBottom 
                multiplier:1.0 
                constant:0.0]; 
[self.view addConstraint:self.textViewBottomConstraint]; 

Когда клавиатура показывает/скрывает анимировать ограничение, установив ограничение постоянная на высоту клавиатуры. Однако, по какой-то причине сбрасывает contentSize до {0,0}, тем самым нарушая прокрутку. Я добавил хак к handleKeyboardDidHide:, чтобы сбросить содержимое в соответствии с тем, что было до сброса, но у него есть некоторые уродливые побочные эффекты, такие как сбрасываемая позиция прокрутки, и вид не прокручивается до положения курсора, пока не начнется ввод текста.

- (void) handleKeyboardDidShow:(NSNotification *)notification 
{ 
    CGFloat height = [KeyboardObserver sharedInstance].keyboardFrame.size.height; 
    self.textView.constant = -height; 
    [self.view layoutIfNeeded]; 
} 

- (void) handleKeyboardDidHide:(NSNotification *)notification 
{ 
    // for some reason, setting the bottom constraint resets the contentSize to {0,0}... 
    // so let's save it before and reset it after. 
    // HACK 
    CGSize size = self.textView.contentSize; 
    self.textView.constant = 0.0; 
    [self.view layoutIfNeeded]; 
    self.textView.contentSize = size; 
} 

Кто-нибудь знает, как избежать этой проблемы вообще?

+0

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

+0

@rdelmar Почему главный вопрос ограничивает или влияет на contentSize каким-либо образом? В любом случае удаление верхнего ограничения означало бы выброс автоопределения вообще для этого диспетчера представлений. – memmons

+0

Потому что, если у вас есть верхнее ограничение, и вы перемещаете снизу вверх до места вершины, то единственный способ удовлетворить ограничения - это иметь 0 высоты. – rdelmar

ответ

1

Я не знаю, что не так с вашим кодом, и мы можем с этим разобраться, если вы хотите. Но в качестве первоначального предложения, если это возможно, не изменить размер UITextView: просто изменить его содержание и прокрутки врезки, как это:

- (void) keyboardShow: (NSNotification*) n { 
    NSDictionary* d = [n userInfo]; 
    CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    self.tv.contentInset = UIEdgeInsetsMake(0,0,r.size.height,0); 
    self.tv.scrollIndicatorInsets = UIEdgeInsetsMake(0,0,r.size.height,0); 
} 

Тем не менее, я считаю, что вы должны ждать, пока клавиатура скрыть анимация завершает перед сбросом этих значений:

- (void) keyboardHide: (NSNotification*) n { 
    NSDictionary* d = [n userInfo]; 
    NSNumber* curve = d[UIKeyboardAnimationCurveUserInfoKey]; 
    NSNumber* duration = d[UIKeyboardAnimationDurationUserInfoKey]; 
    [UIView animateWithDuration:duration.floatValue delay:0 
         options:curve.integerValue << 16 
        animations: 
    ^{ 
     [self.tv setContentOffset:CGPointZero]; 
    } completion:^(BOOL finished) { 
     self.tv.contentInset = UIEdgeInsetsZero; 
     self.tv.scrollIndicatorInsets = UIEdgeInsetsZero; 
    }]; 
} 

(вполне возможно, что этот трюк поможет ваш код как-то так.)