带动态滚动的UITextView调整大小为默认值

时间:2013-12-17 11:24:19

标签: ios objective-c uitextview

我已经实现了一个ViewController,其底部UIView包含UITextView,其滚动功能已禁用,可在您输入时调整大小。

当包含的文字高度达到90像素时,我启用滚动 - >

scrollEnabled = YES;

应该发生什么: UITextView及其superview应保持为限制的高度(超过90像素限制)。

会发生什么: UITextView会调整为默认值。

更多信息: 我使用Multiline UITextField的代码作为我的底层视图。 我正在使用iOS7。

感谢任何帮助,谢谢。

编辑:我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.textBox.scrollEnabled = NO;
    self.textBox.font = [UIFont fontWithName:@"Helvetica" size:14];
    [self registerForKeyboardNotifications];
}

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWasShown:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification 
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector: @selector(keyPressed:)
                                                 name: UITextViewTextDidChangeNotification
                                               object: nil];
}

- (void)keyboardWasShown:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    CGSize kbSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    [self setViewMovedUp:YES byHeight:kbSize.height];
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    CGSize kbSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    [self setViewMovedUp:NO byHeight:kbSize.height];
}

- (void)keyPressed:(id)sender
{
    CGRect textRect = [self.textBox.text boundingRectWithSize:CGSizeMake(255,MAXFLOAT) 
                                                      options:(NSStringDrawingUsesLineFragmentOrigin) 
                                                   attributes:@{NSFontAttributeName : [UIFont fontWithName:@"Helvetica" size:14]} 
                                                      context:nil];
    NSInteger newSizeH = textRect.size.height;
    if (self.textBox.hasText) {
        // if the height of our new chatbox is
        // below 90 we can set the height
        if (newSizeH <= 90) {
            self.textBox.scrollEnabled = NO;
            [self.textBox scrollRectToVisible:CGRectMake(0,0,1,1) 
                                     animated:NO];

            // chatbox
            CGRect chatBoxFrame = self.textBox.frame;
            chatBoxFrame.size.height = newSizeH + 12;
            self.textBox.frame = chatBoxFrame;

            // form view
            CGRect formFrame = self.commentBox.frame;
            formFrame.size.height = 30 + newSizeH;
            self.commentBox.frame = formFrame;
        }

        // if our new height is greater than 90
        // sets not set the height or move things
        // around and enable scrolling
        if (newSizeH > 90) {
            self.textBox.scrollEnabled = YES;
            CGRect frame = self.textBox.frame;
            frame.size.height = 102;
            self.textBox.frame = frame;
            CGRect formFrame = self.commentBox.frame;
            formFrame.size.height = 30 + 90;
            self.commentBox.frame = formFrame;
        }
    }
}

- (void)setViewMovedUp:(BOOL)movedUp byHeight:(CGFloat)height
{
    int movement = movedUp ? -height : height;
    [UIView animateWithDuration:0.3
                     animations:^{
                         self.dataView.frame = CGRectOffset(self.dataView.frame, 0.0, movement);
     }];  
}

2 个答案:

答案 0 :(得分:1)

虽然我有点晚了,但只是因为。 我自己也遇到了同样的问题。滚动时文本视图恢复为原始大小。我解决它的方法是更新UITextView上的高度约束。 这是每次更新UITextView的大小时,您还需要更新相应的约束。

答案 1 :(得分:0)

以下是我在iOS 6和7中使用的代码。

#pragma mark - UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView {

    // I set _maxTextViewHeight based on device, but you can harcode it to 90
    CGSize size = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, _maxTextViewHeight)];
    float desiredTextViewHeight = size.height - 7.5;
    float desiredInputViewHeight = MIN(desiredTextViewHeight + 16.0f, _maxInputViewHeight);

    textView.scrollEnabled = (desiredInputViewHeight == _maxInputViewHeight);

    NSRange bottom = NSMakeRange([textView.text length] - 1, 1);
    [textView scrollRangeToVisible:bottom];

    CGRect inputViewFrame = _inputView.frame;
    float heightDelta = desiredInputViewHeight - inputViewFrame.size.height;
    inputViewFrame.size.height = desiredInputViewHeight;
    inputViewFrame.origin.y -= heightDelta;

    if (heightDelta != 0) {
        [UIView animateWithDuration:0.1 animations:^{
            _inputView.frame = inputViewFrame;
        } completion:nil];
    }
}

您也可以查看此项目https://github.com/jessesquires/MessagesTableViewController