2011-11-11 14 views
5

için Basit bir UINavigationController sahibim. Init yönteminde bir alt görünüm olarak bir UITableView yaratıyorum ve ekliyorum.Şekil initWithFrame: self.view.frame 20 piksel (durum çubuğu) sorunu bir kez ve tüm

- (id)init { 
    self = [super init]; 
    if (self) { 
     NSLog(@"%@", NSStringFromCGRect(self.view.frame)); // {{0, 20}, {320, 460}} 
     tableView = [[UITableView alloc] initWithFrame:self.view.frame]; 
     [self.view addSubview:tableView]; 
    } 
    return self; 
} 

Yeni projelerle çalışırken her zaman aynı can sıkıcı sorunla karşılaştığımı buluyorum. Eklenen tanıtımlar, gezinme çubuğunun 20 pikselin altında olur.

Neden self.view.frame için {{0, 20}, {320, 460}} ile bitti? CGRect çerçevesini zorlamak istemiyorum, bunu görüntü denetleyicinin çerçevesine göre ayarlamayı tercih ediyorum, bu yüzden dinamik çerçeve değişiklikleri (tethering, telefon görüşmesi, vb. Durum çubuğunun daha uzun olduğu yer) ile ilgili sorunları yaşamayacağım. .

Güncelleme: Ayrıca, çerçeve için 460 yükseklik aldığımı fark ettim. Bu da mantıklı değil. Benim durumumda, aslında bir sekme çubuğu var, bu yüzden yükseklik, durum çubuğunun eksi uinavigasyon çubuğu ve eksi sekme çubuğu yükseklikleri değil mi? UIView

Teşekkür

+1

çünkü durum çubuğu 20 piksel yükseklik – SAKrisT

cevap

7

Çerçeve -viewWillAppear, -viewDidAppear yöntemleri denir geçerlidir argüman alır. Çerçeveye güvenmemeli ve daha önce kullanarak herhangi bir hesaplama yapmamalısınız. Eğer görünümünü kullanın ve sadece -loadView yılında, init yöntemde kendisine herhangi denetleyicileri eklemek veya olmamalı, böylece
Ayrıca, denir -viewDidLoad yönteminden önce UIViewController (UITableViewController) ait view özelliği (diğer nesnelerden) kullanmanız gereklidir (daha iyi) -viewDidLoad içinde . Alt görünümünüzü bu yöntemlere ekleyin ve görünümden önce çerçevesini ayarlayın.
ViewController'ın kullanım ömrü görünümü birçok kez yüklenebilir ve boşaltılabilir (örneğin didReceiveMemoryWarning görünümü kaldırır), görünüm hiçbir zaman yüklenemez.

2

İki farklı koordinat sistemini karıştırıyorsunuz. self.view çerçevesi, pencerenin koordinat sisteminde (veya ebeveyn görünümü ne olursa olsun) tanımlanır. tableView'ın çerçevesi self.view'in koordinat sisteminde tanımlanmıştır.

bir şey tüm görünüm doldurmak istiyorsanız, bir görünümün koordinat kendi sisteminde tanımlı

subView.frame = parentView.bounds; 

sınır olduğunu ayarlayın. çerçeve ana görünümünün koordinat sisteminde tanımlanmıştır. Bu yüzden subView.frame ve parentView.bounds aynı koordinat sistemidir.

subview.frame = parentView.frame'u ayarladığınızda, 20 gram = 20 ons'luk bir değerle aynı olmaları gerekmez. Ana görünümün kaynağı (0, 20); alt görünümün kaynağı (0, 20), ancak farklı bir koordinat sisteminde. Pencere koordinat sisteminde (0, 40).

+0

Evet, teşekkürler. Ve gerçekten de, bu, Apples iOS dev docs'da nasıl belgelendiği: UIView sınıf referansı> Özellikler> "sınırlar" ve "çerçeve". –

İlgili konular