如何在节标题中创建UITextView将其高度调整为其内容

时间:2014-02-13 22:31:57

标签: objective-c uitableview ios7

我无法让这个工作。我在当前视图控制器上使用autolayout。我有一个UITableView,它有节标题,每个节标题都有UITextView,文本的长度根据章节而变化。我无法自动扩大其高度以适应内容,因此不需要滚动(其内容属于文本)

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    //UITextView *tv = [[UITextView alloc] init];
    //tv.editable = NO;        
    //tv.attributedText =  [self millionaireResults][section][@"header"];    
    //return tv;

    return [self millionaireResults][section][@"headerview"]; //this is a uitextview
}

// this did not workeither 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    UITextView *tv = [self millionaireResults][section][@"headerview"];
    return tv.frame.size.height; 

}

如何解决这个问题?

我根据Michael的建议更新了代码

2 个答案:

答案 0 :(得分:1)

将您的“UITextView *tv”对象设为属性,然后您可以执行以下操作(假设您的表视图只有一个部分):

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return (self.tv.frame.size.height);
}

如果你有更多的部分(你可以看到),你应该将该属性作为UITextView对象的NSArray。

这也意味着您需要在“tv”被调用之前设置“viewForHeaderInSection:”对象的内容。

答案 1 :(得分:0)

这是对我有用的答案

  1. 创建UITextView时,必须设置scrollEnabled 为假。
  2. 你的UITextView必须给出覆盖水平空间的宽度,否则自动大小计算是关闭的(有时它不是,我认为取决于wordbreak或其他东西,但它是不一致的!)并且只在你旋转时修复它自己强制重绘的设备
  3. 在heightForHeaderInSection方法中,你必须得到 sizeThatFits并将其高度作为文本视图的高度返回
  4. 这是身高计算(我在这个网站上发现了这个http://www.raywenderlich.com/50151/text-kit-tutorial

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        UITextView *tv1 = (UITextView *)[self millionaireResults][section][@"headerview"];
        // sizethatfits calculates the perfect size for this UITextView 
        // if you gave your UITextView full width
        CGSize goodsize = [tv1 sizeThatFits:tv1.frame.size];
        return goodsize.height+4; // here 4 is not necessary, i just put it as an offset
    }
    

    以下是创建这些UITextView对象的代码

    for (int i = 0; i < [milarr count]; i++) {        
        UITextView *tv = [[UITextView alloc] init];
        tv.editable = NO;
        tv.attributedText = milarr[i];
        // labelTopTitle and this table in question have same width in an autoLayouted view
        // so i am giving width of labelTopTitle to let UITextView cover full available
        // horizontal space
        tv.frame = CGRectMake(0, 0, self.labelTopTitle.frame.size.width,FLT_MAX);
        //tv.backgroundColor = [UIColor grayColor];
        //tv.textContainerInset = UIEdgeInsetsZero;
        tv.scrollEnabled = NO;
        [results  addObject:@{@"headerview": tv,
                             @"rows":@[...]
                             }
         ];
    }