iOS - 动态更改uitableview的高度

时间:2014-02-21 20:19:54

标签: ios objective-c uitableview layout

我想为UISearchBar创建建议,所以我添加了UITableView,我希望按内容更改UITableView的高度。

当我收到数据时,我打电话给:

[self.searchTableView reloadData];

并在- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section中我试图调整tableView的大小:

    CGRect bounds = [tableView bounds];
    NSLog(@"%f",tableView.contentSize.height);
    [tableView setBounds:CGRectMake(bounds.origin.x,
                                    bounds.origin.y,
                                    bounds.size.width,
                                    20 * [self.suggestionData count])];

    /*
    CGRect frame = self.searchTableView.frame;;
    frame.size.height = 20 * [self.suggestionData count];
    self.searchTableView.frame = frame;
     */

(20是1行的高度。)我也尝试了tableView.contentSize.height,但它没有用。也许当我试图找到解决方案时,我需要在Storyboard或I中更改某些内容。我只是得到了我在故事板中设置的tableview的高度。感谢

1 个答案:

答案 0 :(得分:0)

由于UITableView扩展了UIScrollView,我建议您使用以下方法来获取其边界适合其内容大小的表视图。

在您的特殊TableView的-init-awakeFromNib(您可以扩展UITableView或创建类别)注册观察者

[self addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];

然后添加

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (object == self && [keyPath isEqualToString:@"contentSize"]) {
        CGRect frame = self.frame;
        CGFloat currentHeight = self.contentSize.height;
        if (fabs(currentHeight - frame.size.height) > FLT_EPSILON) {
            frame.size.height = self.contentSize.height;
            self.frame = frame;
        }
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:nil];
    }
}

请记得在-dealloc

中取消注册观察者
- (void)dealloc {
    [self removeObserver:self forKeyPath:@"contentSize"];
}