2010-04-21 30 views
12

Standart bir UITableView + UISearchDisplayController + UITableViewIndex kurulum var. Her şey bir şampiyon gibi çalışır. Çok özel koşullar altında, endeks ekranda görüntülenemeyecek kadar uzar. Spesifik olarak, bir aramayı bitirdikten ve filtrelenmemiş, endeksli tabloyu yeniden görüntüledikten sonra, bazen çok uzun büyür. Daha spesifik olarak, eğer arama yaparsam iptal edersem bu daha olmaz. Yalnızca arama yaparsam, sonra arama tablosundan bir görünüm denetleyicisini basar, sonra o görüntü denetleyicisini arama tablosuna geri döndürür, sonra aramayı iptal eder, daha sonra 'u yeniden arar ve sonra bu son aramayı iptal eder. Son aramanın sonunda indeks çok uzun.UITableViewIndex beklenmedik şekilde yanlış sınırlara büyüyor

Portre görünümünde tablo görünümü 416 yüksekliğini ve normal koşullarda 404 yüksekliğini bildiriyor. Dizin hatalı bir şekilde boyutlandırıldığında searchDisplayControllerDidEndSearch'dan oturum açıyorsam, 620 yüksekliğini bildiriyor.

Tabloda ve dizinde çerçeveyi manuel olarak yeniden boyutlandırmak için setLayout öğesinden her şeyi denedim. Hiçbir şey işe yaramaz (manuel yeniden boyutta, günlüğe kaydedilecek doğru yüksekliğe neden olur, ancak ekrandaki görüntü değişmez).

+0

Dizini nasıl oluşturuyorsunuz? ViewWillAppear'da yerleşik mi? – gnasher

+0

Bir çeşit arka plan görevini (senkronize) çalıştırıyorsanız, bazı nadir durumlarda doğru kullanıcı arayüzü davranışını engelleyebilir. – elslooo

+0

Görünümünüzde otomatik yeniden boyutlandırma setiniz olup olmadığını kontrol etmek ve görmek isteyebilirsiniz. – fjlksahfob

cevap

1

olursa ...

iptal animasyon müdahale edildi durumda bir gecikmeden sonra yeniden boyutlandırma denemek üzereyken, ama sonra ben de varım saçma şey bir durum fark ve yardım akıllıca olabilir arayan düşünce hala sorun yaşıyorsanız, - [UITableView setFrame:] üzerinde sembolik bir kesme noktası ayarlamayı deneyebilir ve ayarlanmış kare aramanın nereden geldiğini izleyebilirsiniz. HTH

+0

(veya muhtemelen - [UITableView setBounds:]) – nielsbot

0

Benim senaryom yayınlanılandan biraz farklıydı, ama benim durumumda çalışan bir çözüm buldum, bu yüzden burada da bir ilan gönderdim.

FetchedResultsController kullanan ve tablonun sonuna ulaştığınızda bir sunucudan daha fazla öğe yükleyen bir UITableView var. Arama yaparken, fetchedResultsController filtrelenir ve görüntülenecek kadar yeterli olmadığında sunucudan daha fazla giriş yükler.

Bağlantı sonucu döndürdüğünde ("arama" isabetinden sonra), tableViews (orijinal olanı ve searchResultsTableView) yeniden yüklüyorum. Şimdi aramayı iptal ettiğinizde ve her şey normale döndüğünde, problemi sorundan deneyimliyorum. UITableViewIndex beklenmedik sınırlarına kadar büyür.

Ayrıca, UITableView'ın beklenenden çok daha büyük bir boyutta yeniden boyutlandırıldığını da yaşadığım için, bir önsez oynamıştım ve benim için çalıştım.

- (void)loadView 
{ 
    [super loadView]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height -= [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height += [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

Bu ince ayar gerekebilir: En UITableView alt sınıfında (bu ARC/6.1 olduğunu).

İlgili konular