iPhone: Varsayılan olarak UITableView arama çubuğunu gizleyin


85

Arayüz Oluşturucuyu, arama işlevi eklemek için kitaplığın Arama Çubuğunu ve Arama Ekranı Denetleyicisini eklediğim bir tablo görünümü oluşturmak için kullandım. Ancak, IB bunu, görünüm ilk görüntülendiğinde çubuğun ekranın üst kısmında görünecek şekilde ayarladı.

Arama çubuğunun varsayılan olarak nasıl gizleneceğini ancak yine de tablo görünümüyle kaydırılabileceğini bilmek istiyorum (bir örnek için Apple'ın Mail uygulamasına bakın). Aramaya denedim scrollRectToVisible:animated:de viewDidLoadtablo görünümü aşağı kaydırmak için, ama boşuna. Varsayılan olarak arama çubuğunu gizlemenin tercih edilen yolu nedir?

Yanıtlar:


116

Öncelikle, UISearchBar'ı UITableView'ün tableHeaderView'ına eklediğinizden emin olun, böylece tablo içeriği ile kaydırılır ve görünümün üstüne sabitlenmez.

Arama çubuğu, tablo görünümünde bir satır olarak sayılmaz, bu nedenle tablo görünümünün üstünü ilk satıra kaydırırsanız, arama çubuğunu 'gizler':

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

veya Swift ile:

yourTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)

scrollToRowAtIndexPathTablo görünümünü veri içermeden önce kaydırmadığınızdan emin olun ( verilen indexPath geçerli bir satırı işaret etmiyorsa (yani tablo görünümü boşsa) bir istisna oluşturur).


12
Aslında, ekranı doldurmak için yeterli satır yoksa tablo görünümünün kaydırılmamasına neden olan bir sorunla karşılaşıyorum - bir veya iki satırlı bir tabloda bu kod hiçbir şey yapmaz. Bu beklenen davranış mı? Bir şekilde etrafından dolaşabilir miyim?
Tim

18
Bir yol buldum: bir dizin yoluna kaydırmak yerine, tablonun kaydırma görünümünün içerik ofsetini 0.0, 44.0'da bir CGRect'e değiştirin
Tim

107
Tim, gitmenin yolu bu! Self.tableView.contentOffset = CGPointMake (0, self.searchDisplayController.searchBar.frame.size.height);
Joe D'Andrea

1
Btw - [tableView reloadData] 'ya yapılan bir çağrının ardından bu kodu koyarken, tablomun normal kaydırmaya izin vermek için 2 satırdan yeterli satıra gitmesine neden olurken, contentOffset yöntemini kullanmanın aramanın sarsıntılı bir şekilde gösterilmesine ve gizlenmesine neden olduğunu gördüm scrollToRowAtIndexPath yöntemini kullanırken kutusu aynı sarsıntıya sahip değildi.
Chris R

1
HERHANGİ bir koşulda işe yarayan tek nihai yol budur. contentOffsetKarmaşık görünüm denetleyici düzenini kullanıyorsanız, herhangi bir değerle ayarlama bozulur. Ben tavsiye etmiyorum.
eonil

45

UISearchBar'ı UITableView'ün bir alt görünümü olarak eklemeyin, bu gerekli değildir.

UITableView, bunun için mükemmel olan bir tableHeaderView özelliğine sahiptir:

- (void) viewDidLoad {
    [super viewDidLoad]; 
    self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
    self.searchBar.showsCancelButton = YES;    
    self.searchBar.delegate = self;
    self.tableView.tableHeaderView = self.searchBar;     
}

Varsayılan olarak görmek istemiyorsanız:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView setContentOffset:CGPointMake(0, 44)];
}

Ayrıca tekrar gizlemek için iptal düğmesini alıyorum ... (ve klavyeyi kaldır)

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
    [self.searchBar resignFirstResponder];
}

Benim için bu, HIG ile aynı hizada olduğunu hisseden gizli bir UISearchBar uygulaması üreten tek çözümdü. Tablo görünümünün üst kısmına "yapıştığı" diğer çözümler doğal değil.
kurtzmarc

1
Bu çözüm en iyi sonucu verdi. Bence cevap bu olmalı.
darwindeeds

Bu çözüm güzel (+1). Ancak, tableView bazı durumlarda arama çubuğunu düzgün bir şekilde gizlemiyor (benim durumumda: tableview denetleyicisi başka bir görünüm denetleyicisinden geri itildiğinde). Bu sorunla ilgili bir soru var: stackoverflow.com/questions/15222186/… Bu sorunun verilen cevabının yine de pek iyi olmadığını düşünüyorum. @bandejapaisa, herhangi bir fikrin var mı?
Brian

3
Bu benim için iyi çalıştı, ancak 44 boyunca sabit kodlama yerine Apple'ın gelecekte arama çubuğu yüksekliğinde yapabileceği değişikliklere izin vermek için viewWillAppear içinde self.tableView.tableHeaderView.frame.size.height'ı kullanmanızı öneririm.
John Stephen

Bu in'i koyarak viewWillAppearo görünümünüze her sen navigasyon geri edeceğiz çünkü kötü bir fikirdir. Bu, masa görünümünüzün yavaşça aşağı ineceği anlamına gelir. Tahriş edici böcek!
Sirenler

25

ContentOffset, Tim ve Joe D'Andrea tarafından yorumlarda belirtilmiştir, ancak bu, arama çubuğunu gizlemeye bir animasyon eklenerek biraz genişletilmiştir. Arama çubuğunun kaybolmasının biraz beklenmedik olduğunu fark ettim.

İOS 4.0 ve üstünü hedeflemek isteyenler için küçük bir güncelleme, şunu deneyin:

[UIView animateWithDuration:0.4 animations:^{
    self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
 } completion:nil];

Önceki cevap:

[UIView beginAnimations:@"hidesearchbar" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];

self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);

[UIView commitAnimations];


9
Animasyonun bu çözümün anahtarı olduğunu buldum. Animasyon olmadan içerik ofsetini ayarlamaya çalışmak hiçbir şey yapmıyor gibi görünecektir. Bununla birlikte, bu örnekteki animasyon yöntemlerini (veya bloklarını) kullanmak yerine, basitçe [self.tableView setContentOffset: CGPointMake (0,44) animated: TRUE] çağrısının yeterince iyi çalıştığını görüyorum.
quickthyme

Animasyon olmadan hiç çalışmıyor gibi görünüyor. @quickthyme de aynı gözlemi yaptı.
Thilo

5
Ben bunu uygulamak durumunda animasyonlar gerek kalmadan bu konuda başarı elde ettik viewDidAppear:yerine viewDidLoad.
wbyoung

8

Bu çözüme birçok yanıt var, ancak hiçbiri benim için pek işe yaramadı.

Bu mükemmel çalışıyor. Animasyon yok ve üzerine yapılır-viewDidLoad

 - (void)viewDidLoad {
     [super viewDidLoad];
     self.tableView.contentOffset = CGPointMake(0,  self.searchBar.frame.size.height - self.tableView.contentOffset.y);
 }

Not:

Kod searchBar @property, arama çubuğuna bağlı olana sahip olduğunuzu varsayar . Değilse, self.searchDisplayController.searchBarbunun yerine kullanabilirsiniz


bu benim için çalışan tek kişi! , ancak yalnızca viewdidload'u kaldırır ... bu nedenle ilk kez gizlenir, ancak uygulama çalışırken artık gizlenmez. Ve onu görünecek ve görünecek şekilde yerleştirmeyi denedim ama yanlış çalışıyor. Teşekkürler!
fguespe

@fguespe bu garip .. viewDidLoad, görünüm her oluşturulduğunda çağrılmalıdır. UISearchBar'ın başka bir görünümden geri döndükten sonra görünür olduğu hiç başıma gelmedi.
Matej

sekmeli bir uygulama kullanıyorum. Belki o?
fguespe

@fguespe Sorunun bu olabileceğini görüyorum hmm. Ne yazık ki -viewWillAppearişe yaramazsa bunu nasıl çözeceğinizden emin değilim .. Sekme denetleyicisi görünüme geçtiğinde çağrılıyor mu?
Matej

viewwillappear ve viewdidappear çağrılıyor, ancak ikisini de denedim ve görünüm yanlış ofsetlenmiş gibi. Beklenen sonucu döndürmez. Demek istediğim, bir şey var, ama kötü yapıyor.
fguespe

7

Swift 3+ için

Bunu ben yaptım:

Bunu beyan edin var:

    var searchController = UISearchController()

Ve viewDidLoad()yöntemde

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = true
    searchController.searchBar.placeholder = NSLocalizedString("Search", comment: "")
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)

5

Amacım, görünüm denetleyicisi yüklendiğinde düz TableView stilinin tableHeaderView stiline eklenen arama çubuğunu gizlemek ve kullanıcı UITableView'ın üst kısmında aşağı kaydırdığında çubuğu göstermekti. Yani, Swift kullanıyorum ve şu uzantıyı ekledim:

extension UITableView {
    func hideSearchBar() {
        if let bar = self.tableHeaderView as? UISearchBar {
            let height = CGRectGetHeight(bar.frame)
            let offset = self.contentOffset.y
            if offset < height {
                self.contentOffset = CGPointMake(0, height)
            }
        }
    }
}

içinde viewDidLoad () sadece ara:

self.tableView.hideSearchBar()

5

İOS 8'de tableView'i doldurmak için yeterli satır olmadığında mevcut tüm çözümler benim için çalışmıyor çünkü iOS bu durumda eki otomatik olarak ayarlayacaktır. (Yeterli satır olduğunda mevcut yanıtlar iyidir)

Bu konuda 6 saat harcadıktan sonra nihayet bu çözümü aldım.

Kısacası, yeterli hücre yoksa tableView'e boş hücreler eklemeniz gerekir, bu nedenle tableView'in içerik boyutu, iOS'un eki sizin için ayarlamayacağı kadar büyüktür.

İşte Swift'de bunu nasıl yaptım:

1.) bir değişkeni minimumCellNumsınıf özelliği olarak ilan edin

var minimumCellNum: Int?

2.) hesaplamak minimumCellNumve resim tableView.contentOffsetolarakviewWillAppear

let screenHeight = Int(UIScreen.mainScreen().bounds.height)

// 101 = Height of Status Bar(20) + Height of Navigation Bar(44) + Height of Tab Bar(49)
// you may need to subtract the height of other custom views from the screenHeight. For example, the height of your section headers.
self.minimumCellNum = (screenHeight - 103 - heightOfOtherCustomView) / heightOfYourCell
self.tableView.contentOffset = CGPointMake(0, 44)

3.) içinde tableView(tableView: UITableView, numberOfRowsInSection section: Int))

let numOfYourRows = YOUR LOGIC
if numOfYourRows > minimumCellNum {
    return numOfYourRows
} else {
    return minimumCellNum!
}

4.) Film şeridinde ve içinde selectionözniteliği olan boş bir hücre NonekaydedintableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)

if indexPath.row < numOfYourRows {
    return YOUR CUSTOM CELL
} else {
    let cell = tableView.dequeueReusableCellWithIdentifier("EmptyCell", forIndexPath: indexPath) as! UITableViewCell
    return cell
}

5.) içinde tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

if tableView == self.tableView {
    if numOfYourRows < (indexPath.row + 1) {
        return
    }
    YOUR LOGIC OF SELECTING A CELL
}

Bu mükemmel bir çözüm değil, ancak iOS 8'de benim için gerçekten işe yarayan tek geçici çözüm bu. Daha düzgün bir çözüm olup olmadığını bilmek istiyorum.


Bunu iOS 11 için yapmak zorundaydım. ContentOffset'i ayarlamak tek başına iOS 9/10 için 0 veya daha fazla hücre için çalıştı ve ayrıca iOS 11'de 8+ hücre için çalıştı. Bu çözüme daha az ihtiyaç duyulan şey. Nedeni var mı?
Tony

Sanırım bu yazının ilk paragrafı nedenini açıklıyor.
Brian

İlk paragrafı anladım, ancak benim için iOS 11'de yalnızca "bozuk" olması yine de garipti. Hücre sayısı aynı olduğunda (gereğinden az) iOS 9, 10 ve 11 için benzer davranışlar beklerdim. Tekrar teşekkürler ve eski bir gönderiyi gündeme getirdiğiniz için üzgünüz!
Tony

4

Yukarıdakilerin hiçbiri benim için işe yaramadı, bu yüzden birisinin aynı sorunu yaşaması durumunda.

Ben var searchBarolarak ayarlanmış tableHeaderView-iOS7 üzerinde gruplandırılmış masada. In viewDidLoadBen tableView.contentOffset = CGPointMake(0, 44);tutmak için searchBarbaşlangıçta "gizli". Kullanıcı aşağı searchBarkaydırdığında görüntülenir

Hedef: iptal düğmesine dokunulduğunda arama çubuğunu gizle

İçinde searchBarCancelButtonClicked(searchBar: UISearchBar!)

Bu işe yaramadı: [yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; tableView çok yukarı kaydırılıyordu, bu da satır 0'ın toolBar'ın arkasına gitmesine neden oluyordu.

Bu işe yaramadı: tableView.ContentOffset = CGPointMake(0, 44) - hiçbir şey olmuyor

Bu işe yaramadı: tableView.ContentOffset = CGPointMake(0, searchBar.frame.size.height) - hiçbir şey olmuyor

Bu işe yaramadı: tableView.setContentOffset(CGPointMake(0, 44), animated: true); Yine tableView çok fazla yukarı kaydırıyordu, bu da satır 0'ın toolBar'ın arkasına gitmesine neden oluyordu.

Bu kısmen işe yaradı: tableView.setContentOffset(CGPointMake(0, 0) ancak titleForHeaderInSectiontoolBar'ın gerisine gidiyordu

BU ÇALIŞTI: tableView.setContentOffset(CGPointMake(0, -20)

Mantıklı görünmüyor, ancak sadece -20 doğru konuma getirildi


Puanlarınızı gerçekten kodlamamalısınız, neden kullanmıyorsunuz CGRectGetHeight(searchBar.bounds)?
Zorayr

Sanırım bunu, arama çubuğunun yüksekliğini almanız için herhangi bir çerçevenin ayarlanmadığı viewDidLoad () / init () içinde yapıyor olmalısınız.
ViewDidLayoutSubviews

TableView yüklemeyi bitirmediyse, ContentOffsetçözümlerden hiçbiri çalışmayacaktır
Maor

4

İçerik ofseti gitmenin yoludur, ancak her zaman çalışmaz.

estimatedRowHeightSabit bir sayıya ayarlanmışsa çalışmaz . Henüz işin ne olduğunu bilmiyorum. Sorunları gösteren bir proje oluşturdum ve Apple ile bir radar oluşturdum .

Her şeyin nasıl kurulacağına dair hızlı bir örnek istiyorsanız projeye göz atın.


1
Teşekkür ederim! Aradığım buydu. Yukarı çıkmalısın.
user2387149

3

Tablo görünümünde veri yoksa kabul edilen cevabın çökeceğini unutmayın. Ve viewDidLoad'a eklemek belirli durumlarda çalışmayabilir.

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; // crashes if no rows/data

Bu nedenle, bunun yerine şu kod satırını ekleyin:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [yourTableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height)];
}

2

Açıkçası, cevapların hiçbiri sorunu gerçekten çözmedi (benim için). Tablo görünümünüzde satır yoksa VEYA satır yüksekliği farklıysa, bu yanıtlar yeterli değildir.

Çalışan tek şey:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.tableView.contentOffset = (CGPoint){.y =  self.tableView.contentOffset.y + self.searchController.searchBar.frame.size.height};
}

Ofset problemi için iyi bir çözüm. Bir UINavigationController kullanırken benim için çalışıyor.
Andreas Kraft

1
Satır sayısı tüm ekranı kapsamadığında çözüm işe yaramıyor - bunun için bir çözüm biliyor musunuz?
Zorayr

Bunu tamamen anladığımdan emin değilim. Tabloda sadece birkaç satırım olduğunda bu benim için işe yarar. Ancak aşağıdaki kullanırım: self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];.
p0lAris

2

scrollToRowAtIndexPathTabloda sıfır satır varsa yöntemi çökmesine neden olur.

UITableView sadece bir kaydırma görünümüdür, bu nedenle içerik ofsetini kolayca değiştirebilirsiniz.

Bu, tableHeaderView olarak bir şeye sahip olduğunuzu kontrol eder ve bunu gizlemek için kaydırma yaptığınızı varsayar.

    if let searchHeight = tableView.tableHeaderView?.frame.height {
        tableView.setContentOffset(CGPoint.init(x: 0, y:searchHeight ), animated: false)
    }

1

TableView boş olduğunda "Notes" uygulamasının öğeleri arayamadığını görüyorum. Bu yüzden -(void)addSubview:(UIView *)viewilk başta boş bir masa eklemek için kullanıldığını düşünüyorum . Veri kaynağı dizisine bir öğe eklediğinizde, tableView'i yüklemek için başka bir kod parçası çalıştıracaktır.

Yani benim çözümüm:

if([self.arrayList count] > 0)
{
     [self.tableView reloadData];     //use jdandrea's code to scroll view when cell==nil in cellForRowAtIndexPath
     self.tableView.scrollEnabled = YES;
}
else
{
     tableBlank = [[UITableView alloc]initWithFrame:CGRectMake(0,0,320,416) style:UITableViewStylePlain] autorelease];
     tableBlank.delegate = self;
     tableBlank.dataSource = self;
     [self.view addSubview:tableBlank];
}

Bu yardımcı olur umarım :-)


1

TableView sınırlarını değiştirin, bu içeride yapılabilir, viewDidLoadayrıca tablonun boş olup olmadığı konusunda endişelenmenize gerek yoktur (istisnadan kaçınmak için).

CGRect newBounds = self.tableView.bounds;
newBounds.origin.y = newBounds.origin.y + self.searchBar.bounds.size.height;
self.tableView.bounds = newBounds;

Kullanıcı tabloyu aşağı kaydırdığında, arama çubuğu görünecek ve normal şekilde davranacaktır.


1

Bu soruya verilen diğer yanıtlar ya benim için hiç işe yaramadı, tableView 0 satır olduğunda garip davranışlara sahipti ya da üst ve iç içe satır öğeleri arasında ileri geri giderken kaydırma konumunu bozdu. Bu benim için çalıştı (amaç, yüklenirken UISearchBar'ı gizlemekti):

public override func viewWillAppear(animated: Bool) {        
    if self.tableView.contentOffset.y == 0 {
        self.tableView.contentOffset = CGPoint(x: 0.0, y: self.searchBar.frame.size.height) 
    }
}

Açıklama
Herzaman tableViewUISearchBar görünür ise görünecektir, bu kod denetler (anlam görmek ykonumunu contentOffsetolduğunu, nam kaydırma konumuna 0). Eğer öyleyse, sadece searchBar'ın yüksekliğini aşağı kaydırır. SearchBar görünür değilse (içindeki öğelerin daha büyük bir listesini düşünün tableView), tableViewiç içe yerleştirilmiş bir satır öğesinden döndüğünüzde konumlandırmayı bozacağından, bunu denemeyecek ve kaydırmayacaktır .

Yan Not
Tek bir sorumluluğu sağlamak ve size kodunuzda istediğiniz zaman yeniden çağırabilmeniz için bu kodu ayrı bir yönteme koymanızı öneririm.


1

Tablonuzda her zaman en az bir satır olacaksa, tablonun ilk satırına kaydırmanız yeterlidir; arama çubuğu otomatik olarak gizlenir.

let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)

self.tableView.selectRowAtIndexPath (firstIndexPath, animasyonlu: false, scrollPosition: .Top)

Yukarıdaki kodu viewDidLoad'a koyarsanız, tableView henüz yüklenmediği için bir hata verecektir, bu yüzden bunu viewDidAppear'a koymanız gerekir çünkü bu noktaya kadar tableView zaten yüklenmiştir.

Bunu viewDidAppear'a koyarsanız , tableView'i her açtığınızda en üste kaydırılır.

Belki tableView bir UITabBar View Controller olduğunda veya bir segment yapıp sonra geri döndüğünüzde olduğu gibi tableView açık kalırsa bu davranışı istemezsiniz. Yalnızca ilk yüklemede en üste kaydırılmasını istiyorsanız, bir ilk yükleme olup olmadığını kontrol etmek için bir değişken oluşturabilirsiniz, böylece yalnızca bir kez yukarı kaydırılır.

Önce, görünüm denetleyicisi sınıfında isInitialLoad adlı bir değişken tanımlayın ve bunu "true" olarak ayarlayın:

var isInitialLoad = true

Ardından, viewDidAppear üzerinde isInitialLoad'un true olup olmadığını kontrol edin ve eğer doğruysa, en üste kaydırın ve isInitialLoad değişkenini false olarak ayarlayın:

if isInitialLoad {
            let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)
            self.tableView.selectRowAtIndexPath(firstIndexPath, animated: false, scrollPosition: .Top)

            isInitialLoad = false
        }

1

Aşağıdaki kod benim için çalışıyor

self.tableView.contentOffset = CGPointMake(0.0, 44.0);

1

İçerik ofsetini ve scrollToIndexpath'i ayarlamayı denedim, ancak hiçbir şey tatmin edici bir şekilde çalışmadı. ViewDidLoad'dan searchBar olarak tableHeaderView ayarını kaldırdım ve aşağıdaki gibi scrollview delegate olarak ayarladım

override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    if scrollView.contentOffset.y < 0 && tableView.tableHeaderView == nil {
        tableView.tableHeaderView = searchController.searchBar
        tableView.setContentOffset(CGPointMake(0, scrollView.contentOffset.y + searchController.searchBar.frame.size.height), animated: false)
    }
}

Bu bir cazibe gibi çalıştı. İçerik dengeleme ayarı, düzgün kaydırma amaçlı


0

Durum çubuğunu ve gezinme çubuğunu dikkate almayı unutmayın . Tablo görünümü denetleyicim, bir gezinme denetleyicisinin içine yerleştirilmiştir viewDidAppear:

tableView.contentOffset = CGPointMake(0, -20) // -20 = 44 (search bar height) - 20 (status bar height) - 44 (navigation bar height)

benim için çalıştı.


0

Swift için:

Sadece arama çubuğunun yüksekliği gibi olması gereken tablo görünümü içeriğini y ofseti yapın.

self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height)

0

Hızlı 3

boş masa ile de çalışır!

Ortamımda xib dosyasıyla özel hücreler yüklüyorum ve rowHeight otomatik olarak ayarlandı.

    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        self.tableView.contentOffset = CGPoint(x: 0, y: self.tableView.contentOffset.y + self.searchController.searchBar.bounds.height)
}

0

Benim de benzer bir problemim vardı. Ve bu sorunu çözmenin tek yolu, UITableView contentOffset özelliğinde anahtar değer gözlemcisini kullanmaktı.

Bazı hata ayıklamalardan sonra, sorunun yalnızca tablo görünümü içerik boyutu tablo görünümünden daha küçükse ortaya çıktığını fark ettim. ViewWillAppear'deyken KVO'yu başlatıyorum. Ve görünüm göründükten 0,3 saniye sonra gönderim KVO'yu durdurur. ContentOffset'in 0.0 olduğu her seferinde, KVO tepki verir ve contentOffset'i arama çubuğu yüksekliğine ayarlar. KVO'yu 0.3 saniye sonra zaman uyumsuz olarak durduruyorum çünkü görünüm düzeni, görünüm göründükten sonra bile contentOffset'i sıfırlayacak.

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  [self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
}

-(void)viewDidAppear:(BOOL)animated{
   __weak typeof (self) weakSelf = self;
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [weakSelf.tableView removeObserver:self forKeyPath:@"contentOffset"];});
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"contentOffset"] && self.tableView.contentOffset.y == 0.0) {
       self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.tableView.tableHeaderView.frame));
    }
}

-(void)dealloc {
    [self.tableView removeObserver:self forKeyPath:@"contentOffset"];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.