2012-11-26 10 views
16

Çok basit bir sorun yaşıyorum. Bu view içinde bu UITableView var ve bu tablonun yüksekliği tablodaki tüm satırları görüntülemek için olması gerektiği kadar yüksek yapmak istiyorum. Bu yüzden, kaydırma yapabilmek istemiyorum, sadece tüm satırların görünmesini istiyorum. (Satırlar miktar bakımından dinamik ve height). 20 satır yoksaUITableView'un yüksekliğini yalnızca toplam içerik boyutuna sığması gerektiği kadar yüksek olacak şekilde yeniden boyutlandırın

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping]; 
    return cellSize.height; 
} 

, masa çok yüksek olacak, ancak sadece 1 satır varsa, çok küçük olacaktır ve diğer içerikler aşağıda 19 satır görünmez.

cevap

22

Ben doğru anlamak durumunda, o dayalı tableview yüksekliğini her satır için yükseklik kadar ekleyin ve ayarlamak mümkün olmalıdır: Hemen [tableView reloadData]

sonra

CGFloat tableHeight = 0.0f; 
for (int i = 0; i < [_stepsArray count]; i ++) { 
    tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
} 
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, tableHeight); 

bunu yapabilirsin böyle deneyebilirsiniz

+0

Ben [tableview reloadData] hiç aramıyorsun. Bunu nereye koymalıyım? – abisson

+0

tamamlandıktan sonra _stepsArray (veri kaynağınız olduğunu varsayarak) ayarlamayı bitirdiniz. –

+1

heightForRowAtIndexPath bununla iki kez çağrılacak değil mi? Ayrıca ... bunu yapmanın daha basit bir yolu yok mu? Sooo'yu masaların boyunun toplam satır sayısından oluştuğu birçok uygulama gördüğümü hissediyorum. Teşekkürler! – abisson

4

,

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){ 
     NSLog(@"%f",your_tableView.contentSize.height); 
    } 
} 

yılında Swift 3.0

func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row { 
     print("\(tableView.contentSize.height)") 
    } 
} 
6

İşte daha basit bir çözüm: İhtiyacınız olan tüm şey, sizeToFit, UITableView, hücrelerle doldurulduktan sonra ayarlamaktır. Eğer xib aracılığıyla delegate ve dataSource ayarlarsanız, bu gibi, viewDidLoad yöntemiyle veya viewDidAppear yapabilirsiniz: kodda yere delegate ve dataSource eklerseniz,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [yourTableView sizeToFit]; 
} 

Ama sonra sizeToFit koymak zorunda Bu: Eğer bir yere bunu yaparsan

- (void)someMethod 
{ 
    [yourTableView setDelegate:self]; 
    [yourTableView setDataSource:self]; 

    [yourTableView sizeToFit]; 
} 

Ayrıca, reloadTable sonra bunu yapmak zorunda.

Bu, tablonuzu tam olarak, yüksekliğinin toplamı olan yüksekliğe yeniden boyutlandıracaktır!

+0

Bu doğru DennisWelu, ** sizeToFit ** satırlar arasındaki boşlukları değil, yalnızca satır içeriğini dikkate alacaktır. – akelec

3

geri arama

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

buna göre viewDidLoad

kod aşağıdaki satırı Tablo görünümünde contentSize özelliği için bir gözlemci ekleyin ve çerçeve boyutunu ayarlamak:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    { 
     CGRect frame = your_tableview.frame; 
     frame.size = your_tableview.contentSize; 
     your_tableview.frame = frame; 
    } 

Bu yardımcı olur umarım.

0

Sorununuzu çözecek olan tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; kullanın.

0

Seti masada bir yükseklik kısıtlaması, görünümünüzü kontrolöre şu bir prize bağlanmak ve ekleyin:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    tableViewHeightContraint.constant = tableView.contentSize.height 
}