Подтвердить что ты не робот

Изменить высоту проблемы inputAccessoryView

Когда я изменяю высоту inputAccessoryView в iOS 8, inputAccessoryView не идет вправо, но закрывает клавиатуру.

enter image description here

Вот несколько фрагментов кода:

в контроллере табличного представления

- (UIView *)inputAccessoryView {
    if (!_commentInputView) {
        _commentInputView = [[CommentInputView alloc] initWithFrame:CGRectMake(0, 0, [self width], 41)];
        [_commentInputView setPlaceholder:NSLocalizedString(@"Comment", nil) andButtonTitle:NSLocalizedString(@"Send", nil)];
        [_commentInputView setBackgroundColor:[UIColor whiteColor]];
        _commentInputView.hidden = YES;
        _commentInputView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
    }

    return _commentInputView;
}

в CommentInputView

#when the textview change height
- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height {
    if (height > _textView_height) {
        [self setHeight:(CGRectGetHeight(self.frame) + height - _textView_height)];
        [self reloadInputViews];
    }
}

в категории UIView из ios-helpers

- (void)setHeight: (CGFloat)heigth {
    CGRect frame = self.frame;
    frame.size.height = heigth;
    self.frame = frame;
}
4b9b3361

Ответ 1

Наконец, я нашел ответ. В ios8 яблоко добавляет NSContentSizeLayoutConstraints для вводаAccessoryView и устанавливает константу с 44. Вы не можете удалить эту константу, потому что ios8 использует ее для вычисления высоты inputAccessoryView. Таким образом, единственным решением является изменение значения этой константы.

Пример

в ViewDidAppear

- (void)viewDidAppear:(BOOL)animated {
    if ([self.inputAccessoryView constraints].count > 0) {
        NSLayoutConstraint *constraint = [[self.inputAccessoryView constraints] objectAtIndex:0];
        constraint.constant = CommentInputViewBeginHeight;
    }
}

изменить inputAccessoryView height при изменении высоты текстового поля

- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height {

    NSLayoutConstraint *constraint = [[self constraints] objectAtIndex:0];
    float new_height = height + _textView_vertical_gap*2;

    [UIView animateWithDuration:0.2 animations:^{
        constraint.constant = new_height;
    } completion:^(BOOL finished) {
        [self setHeight:new_height];
        [self reloadInputViews];
    }];
}

То есть.

Ответ 2

Один из способов обновления ограничения, упомянутого в ответе Yijun, при изменении высоты inputAccessoryView заключается в перезаписи setFrame: на вашем inputAccessoryView. Это не зависит от ограничения высоты, являющегося первым в массиве.

- (void)setFrame:(CGRect)frame {
    [super setFrame:frame];

    for (NSLayoutConstraint *constraint in self.constraints) {
        if (constraint.firstAttribute == NSLayoutAttributeHeight) {
            constraint.constant = frame.size.height;
            break;
        }
    }
}

Ответ 3

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

Ответ 4

После прочтения вышеприведенного ответа, который является отличной находкой, я был обеспокоен тем, что полагаться на ограничение, которое вам нужно изменить, [0] или firstObject - это деталь реализации, которая может измениться под нами в будущем.

После небольшого отладки я обнаружил, что ограничения, добавленные Apple, на представление ввода аксессуаров, похоже, имеют приоритет 76. Это сумасшедшее низкое значение, а не одно из перечисленных перечислений в документации для priority.

Учитывая это низкое значение priority, кажется, что более чистое решение просто условно добавляет/удаляет другое ограничение с высоким уровнем приоритета, скажем UILayoutPriorityDefaultHigh, когда вы хотите изменить размер представления?

Ответ 5

Попробуйте следующее: _vwForSendChat - вид вспомогательного устройства ввода _txtViewChatMessage - это внешний вид аксессуаров для просмотра текста

-(void)textViewDidChange:(UITextView *)textView {
CGFloat fixedWidth = textView.frame.size.width;
CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
CGRect newFrame = textView.frame;
newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
if (newFrame.size.height < 40) {
    _vwForSendChat.frame = CGRectMake(0, 0, self.view.frame.size.width, 40);
} else {
    if (newFrame.size.height > 200) {
        _vwForSendChat.frame = CGRectMake(0, 0, self.view.frame.size.width, 200);
    } else {
       _vwForSendChat.frame = CGRectMake(0, 0, self.view.frame.size.width, newFrame.size.height);
    }
}
[self.txtViewChatMessage reloadInputViews];
}