动态更改UITextView高度而不是滚动

时间:2011-07-03 18:19:15

标签: iphone objective-c ios

我正在尝试创建一个简单的日记应用。在其中我有一个ShowPostTableViewController,我想显示每个帖子。在我的tableView中,我有一个带有两个单元格的部分,一个用于标题,一个用于帖子的主体。标题位于UITextField内部,正文位于UITextView内。我声明这两个:

UITextField * postHeadline;
UITextView * postText;

我在我的实现文件中合成它们。我在willDisplayCell方法中设置tableView的单元格。它看起来像这样:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell   
forRowAtIndexPath:(NSIndexPath *)indexPath {

    tableView.allowsSelection = NO;

    CGRect wholeWindow = [self.view bounds];
    float headlineHeight = 40;

    CGRect headlineRect = CGRectMake(10, 10, wholeWindow.size.width, headlineHeight);

    CGRect bodyRect = CGRectMake(wholeWindow.origin.y, wholeWindow.origin.x, 
    wholeWindow.size.width, wholeWindow.size.height);

    postHeadline = [[UITextField alloc] initWithFrame:headlineRect];
    postText = [[UITextView alloc] initWithFrame:bodyRect];

    NSString * headline = [[NSString alloc] initWithFormat:@"%@",[currentPostArray 
    objectAtIndex:0]];

    NSString * body = [[NSString alloc] initWithFormat:@"%@",[currentPostArray 
    objectAtIndex:1]];

    postHeadline.text = headline;

    postHeadline.font = [UIFont fontWithName:@"Helvetica-Bold" size:24.0];

    postText.text = body;
    postText.backgroundColor = [UIColor colorWithRed:254.0/255.0 green:255.0/255.0   
        blue:237.0/255.0 alpha:1];
    postText.font = [UIFont fontWithName:@"Georgia" size:17.0];
    postText.scrollEnabled = NO;
    postText.delegate = self;

    if (indexPath.row == 0) {
        [cell.contentView addSubview:postHeadline];
    }
    if (indexPath.row == 1) {
        [cell.contentView addSubview:postText];
        CGRect frame = postText.frame;
        frame.size.height = postText.contentSize.height;
        postText.frame = frame;
    }
}
是的,我是初学者,可能会像疯了一样泄露记忆。与此相关的问题。看起来我的UITextField postHeadline设置了两次,我无法删除它,因为它是同一文本的两层。我怎么解决这个问题?

回到我原来的问题。我的cellForRowAtIndexPath完好无损。我已经为我的UITextView配置了委托方法(认为这就是问题所在)。我找到了一个几乎可以在这里工作的解决方案:UITextView change height instead of scroll

他们看起来像这样:

- (void)textViewDidBeginEditing:(UITextView *)textView
{
    textView.frame =CGRectMake(textView.frame.origin.x,textView.frame.origin.y,textView.
frame.size.width,textView.frame.size.height + 100);

}

此方法应调整textView:

的大小
- (void)textViewDidChange:(UITextView *)textView
{

    CGFloat fontHeight = (textView.font.ascender - textView.font.descender) + 1;

    CGRect newTextFrame = textView.frame;
    newTextFrame.size = textView.contentSize;
    newTextFrame.size.height = newTextFrame.size.height + fontHeight;
    textView.frame = newTextFrame;

}

我像这样设置行高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath  
*)indexPath
{

    NSString * body = [[NSString alloc] initWithFormat:@"%@",[currentPostArray 
objectAtIndex:1]];

    CGSize bodySize = [body sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0] 
constrainedToSize:CGSizeMake(self.view.frame.size.width,CGFLOAT_MAX)];

    if (indexPath.section == 0 && indexPath.row == 1) {
        return bodySize.height + 100;
    }    
    return 50;
}

这件事几乎可行。当用户点击返回时,textview似乎会扩展,但它只能工作14次,然后光标隐藏在键盘后面。

如何解决这个问题的任何想法和提示都会很棒!

由于 //安德斯

修改

我通过将大部分willDisplayCell方法代码移动到viewDidLoad方法解决了“标题设置两次”的问题。而且我认为我已经将本地化的问题放在了哪里。我认为这是我的heightForRowAtIndexPath方法。它目前看起来像这样:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath    
*)indexPath
{

    NSString * body = [[NSString alloc] initWithFormat:@"%@",[currentPostArray   
objectAtIndex:1]];

    CGSize bodySize = [body sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0]  
constrainedToSize:CGSizeMake(self.view.frame.size.width,CGFLOAT_MAX)];

    if (indexPath.section == 0 && indexPath.row == 1) {
        return bodySize.height + 100;
    }    
    return 50;
}

由于数组及其内容在viewDidLoad方法中设置,因此大小保持不变。因此,我认为我需要在TextView的内容之后动态增加单元格的大小。因为当我写这样的时候:

if (indexPath.section == 0 && indexPath.row == 1) {
    return 1000;
}   

单元格的大小增加,用户可以在键盘进入之前更多次点击“返回”。有没有办法动态增加细胞的高度?

1 个答案:

答案 0 :(得分:1)

认为我解决了它。这些方法做了神奇的伎俩:

[self.tableView beginUpdates];
[self.tableView endUpdates];

我更新了我的heightForRowAtIndexPath,所以它看起来像这样:

if (indexPath.section == 0 && indexPath.row == 1) {        
    return postText.frame.size.height + headlineHeight; 
}    
return 44;

我将这些方法添加到viewDidChange和viewWillAppear(重置大小)。

[self.tableView beginUpdates];
[self.tableView endUpdates];

这就是它。