7

heightForRowAtIndexPath:我使用该方法有一个具有不同单元格高度的表格视图。

我想动态设置 a 的高度UITableView。目前我正在viewDidLoad使用以下方法设置 tableView 的尺寸:

self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 770, 310, 400)];
self.tableView.dataSource = self;
self.tableView.delegate = self;

我想也许我可以添加这个:self.tableView.contentSize.height;但问题当然是内容大小仅在表格加载后计算,所以如果我把它放在

self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 770, 310, self.tableView.contentSize.height)];

它不起作用。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *description = [photosFromCommentsArray objectAtIndex:indexPath.row];
    //   NSLog(@"description is %@",description);

    if(description == (id)[NSNull null])
    {
        return 70; 
    }
    else
    {
        return 200;
    }
}
4

5 回答 5

20

在 table view 上为 contentSize 属性添加一个观察者,并相应地调整框架

[self.tableView addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];

然后在回调中:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    CGRect frame = self.tableView.frame;
    frame.size = self.tableView.contentSize;
    self.tableView.frame = frame;
}
于 2013-09-13T11:06:31.283 回答
0

您可以随时设置 tableView 的框架。您甚至可以为大小的变化设置动画。

于 2013-09-13T11:04:05.820 回答
0

您好您可以使用以下代码获取文本的高度并根据它设置高度。

CGFloat textViewWidth = CGRectGetWidth(textView.bounds);
CGSize inset = CGSizeMake(5.0,5.0);
CGSize stringSize = [myString sizeWithFont:textView.font constrainedToSize:CGSizeMake(textViewWidth-2*inset.width,1024) lineBreakMode:UILineBreakModeWordWrap];
BOOL textOutOfFit = stringSize.height+2*inset.height>CGRectGetHeight(textView.bounds);
于 2013-09-13T11:06:29.207 回答
0

在viewDidLoad试试这个:

[tableView setFrame:CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y + 4, tableView.frame.size.width, tableView.frame.size.height - 65)];
于 2014-09-09T06:19:41.470 回答
0

第 1 步:在 viewDidLoad() 中添加观察者

self.tableView.addObserver(self, forKeyPath: "contentSize", options: [], context: nil)

第二步:添加方法

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    self.tableViewHeight.constant = tableView.contentSize.height
}

第 3 步:移除观察者

override func viewDidDisappear(_ animated: Bool) {
    self.removeObserver(self, forKeyPath: "contentSize", context: nil)

}

替代解决方案:

    tableView.separatorStyle = .none
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = CGFloat(70.0)

self.tableViewHeight.constant = CGFloat.greatestFiniteMagnitude self.tableView.layoutIfNeeded()

self.tableView.reloadData()

覆盖 func viewWillLayoutSubviews() { super.viewWillLayoutSubviews()

    UIView.animate(withDuration: 0, animations: {
        self.tableView.layoutIfNeeded()
    }) { (complete) in
        var heightOfTableView: CGFloat = 0.0
        // Get visible cells and sum up their heights
        let cells = self.tableView.visibleCells
        for cell in cells {
            heightOfTableView += cell.frame.height
        }
        // Edit heightOfTableViewConstraint's constant to update height of table view
        self.tableViewHeight.constant = heightOfTableView
    }
}

另一个解决方案:

self.tableViewHeight.constant = CGFloat(arrVideoList.count * 80)
self.view.updateConstraintsIfNeeded()
于 2019-06-17T13:29:18.040 回答