2012-08-22 24 views
9

Satırları doğru şekilde yeniden boyutlandırma Görünümler, dinamik görünümleri olan satırları olan bir NSTableView tablo görünümü boyutu değiştiğinde satırlarını yeniden boyutlandırmaz. Bu, satır yüksekliğinin tablo görünümünün genişliğinden türetildiği bir sorundur (bir sütunu dolduran metin bloklarını düşünün ve böylece satır boyutunu genişletir). Görünüm tabanlı NSTableView

Ben boyutu değişti Spor'un satırları yeniden boyutlandırmak için NSTableView almaya çalışıyordum ama biraz başarı yaşamış:

  • Ben enumerateAvailableRowViewsUsingBlock:, görünmeyen bazı satırları sorgulayarak sadece görünür satırları yeniden boyutlandırma ise yeniden boyutlandırılmaz ve kullanıcı bu satırları kaydırıp gösterdiğinde eski yükseklikte gösterilir.
  • Tüm satırları yeniden boyutlandırırsam, çok sayıda satır olduğunda (1.8Ghz i7 MacBook Air'imde 1000 satır için her bir pencerede yeniden boyutlandırıldıktan sonra yaklaşık 1 saniye gecikme) fark edilir derecede yavaş olur.

Kimse yardımcı olabilir?

Tablo görünümü boyutu değişikliğini tespit burasıdır - masa görünümün temsilci:

: Aşağıdaki Oysa

- (void)tableViewColumnDidResize:(NSNotification *)aNotification 
{ 
    NSTableView* aTableView = aNotification.object; 
    if (aTableView == self.messagesView) { 
     // coalesce all column resize notifications into one -- calls messagesViewDidResize: below 

     NSNotification* repostNotification = [NSNotification notificationWithName:BSMessageViewDidResizeNotification object:self]; 
     [[NSNotificationQueue defaultQueue] enqueueNotification:repostNotification postingStyle:NSPostWhenIdle]; 
    } 
} 

görünür satırlar resized olsun yukarıda yayınlanan bildirimin ait işleyicisi olan

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView; 

    NSMutableIndexSet* visibleIndexes = [NSMutableIndexSet new]; 
    [messagesView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row) { 
     if (row >= 0) { 
      [visibleIndexes addIndex:row]; 
     } 
    }]; 
    [messagesView noteHeightOfRowsWithIndexesChanged:visibleIndexes]; 
} 

tüm satırları boyutlandırır alternatif uygulama şuna benzer:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView;  
    NSIndexSet indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,messagesView.numberOfRows)];  
    [messagesView noteHeightOfRowsWithIndexesChanged:indexes]; 
} 

Not: Bu soru bir şekilde View-based NSTableView with rows that have dynamic heights ile ilgilidir, ancak tablo görünümünün boyut değişikliğine yanıt vermeye daha odaklıdır.

cevap

11

Sadece bu kesin sorunu yaşadım. Benim yaptığım kaydırma görünümün içerik görünümü

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewContentBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:self.scrollView.contentView]; 

için NSViewBoundsDidChangeNotification izlemek ve işleyicisinde, görünür satırları almak ve noteHeightOfRowsWithIndexesChange çağrı oldu :. Bunu yaparken görünümü en hızlı biçimde gerçekleştirmek zorundadır masanın

- (void)scrollViewContentBoundsDidChange:(NSNotification*)notification 
{ 
    NSRange visibleRows = [self.tableView rowsInRect:self.scrollView.contentView.bounds]; 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:0]; 
    [self.tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndexesInRange:visibleRows]]; 
    [NSAnimationContext endGrouping]; 
} 

girmesi gibi kullanıcı satırları yeniden boyutlandırma sırasında oynatmak görmemesi için animasyon devre dışı böylece tablo güzel kaydırır ama onun benim için çok iyi çalışıyor.

+0

Benim için kullanıcının yeniden boyutlandırmayı tamamlamasını bekledikten sonra satır yüksekliğini yeniden ayarlamasını bekledim. – adib

+1

görünüşe göre, kaydırma görünümü içerik görünümü '' [self.scrollView.contentView setPostsBoundsChangedNotifications: YES] ' – adib

+1

çağrıldıktan sonra bile NSViewFrameDidChangNotification 'ı gerçekte yazılsa da, NSViewFrameDidChangNotification için –

İlgili konular