IOS7: UINavigationController'da UIScrollView uzaklığı


126

Şu anda uygulamamı ios 7'ye taşıyorum ve saatlerdir yeni gezinti denetleyicisi / çubuk yönetiminde takılı kaldım.

Daha önce, bir gezinme denetleyicimiz varken, şöyle bir pasajımız vardı:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

Arayüz oluşturucuda, görünüm için mevcut bir gezinme çubuğu ayarlama seçeneğimiz vardı ve her şey gerçek görünümün içeriğiyle eşleşiyordu.

Tamam, şimdi, arayüz oluşturucu ile nasıl düzgün tasarım yapacağıma dair hiçbir fikrim yok. Navigasyon denetleyicimi başlatmak için pasajım hala var. Bununla birlikte, MainViewController'ımın arayüz oluşturucusunda, bir durum çubuğunu yarı saydam veya opak gezinme çubuğuna ayarlarsam, üstte 44px'lik bir ofsetim var (aşağıya bakın).


Arayüz Oluşturucu_________________________ ve sonuç


Şimdi, durum çubuğunu yok olarak ayarlarsam, üstte kayma olmaz, ancak simülatördeki görünüm gezinme çubuğu nedeniyle daha küçük olduğundan arayüz oluşturucudaki görünümün alt kısmı kesilir.

Arayüz Oluşturucu_________________________ ve sonuç

Sanırım burada gerçekten bir şey özlüyorum ama iOS7 Geçiş Kılavuzunda bununla ilgili herhangi bir konu veya elma bilgisi bulamıyorum.

Yardımınız için teşekkürler


DÜZENLE

Resimlerde de görebileceğimiz gibi, görünümün ilk çocuğu her iki etiketi de içeren bir UIScrollView'dur, kaydırma görünümü olmadığında sorun ortaya çıkmaz. Ayrıca bir UITableView ise görünür. Bir etiket UIScrollView dışındaysa, bu etiketin ofseti yoktur.


Eğer değilseniz Otomatik Düzen'i kullanmak isteyebilirsiniz, böylece belirli görünümlerin ekranın üstünden / altından / yanından belirli bir mesafede olduğundan emin olabilirsiniz
erdekhayser

Gerçekten Otomatik Düzen kullanmıyorum, ancak kullanmak (onay kutusunu işaretlemek) sorunu çözmüyor.
Streem

Otomatik Düzen ile görünümlerin yerinde kalması için kısıtlamalar ayarlamanız gerekir. Xcode ne istediğinizi otomatik olarak bilmez.
erdekhayser

Önceki düzenlemenizi görünce, sorununuzu yeni keşfettim. Maalesef en bariz çözüm bu değil. Her şeyi yeniden açıklamaya çalışmak yerine, bu videoyu Youtube'da kaydırma görünümlerinin nasıl ayarlanacağını öğrenmek için kullandım. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be İyi Şanslar. Ne yaptığını tam olarak anlamak için onu birkaç kez izledim.
erdekhayser

Yanıtlar:


286

Tamam, çözümü buldum, denetleyicimde özelliği ayarladım:

self.automaticallyAdjustsScrollViewInsets = false

Yine de bu özelliğin gerçek faydasını gerçekten anlamıyorum (veya varsayılan değerin neden doğru olduğunu)

Bulduğum tek belge oradaydı:

Güncelleme

İOS 11'de automaticallyAdjustsScrollViewInsetskullanımdan kaldırıldı

Şimdi kullanmalısınız:

self.tableView.contentInsetAdjustmentBehavior = .never

Ayrıca , bu özellikleri daha iyi anlamak için bu soruyu ve yanıtını kontrol etmenizi tavsiye ederim.


12
Harika bul. Film şeridindeki UIScrollView gerçekten karmaşık. Apple'ın bunu Xcode'un gelecekteki sürümlerinde biraz sorunsuz yapmasını diliyorum.
p0lAris

4
Bu kod UIScrollView, kaydırmamı engelliyor . Ama bu olmadan ofsetten kurtulamam. Weired ...
scaryguy

9
Bu bayrak, film şeridinizde / ucunuzda da kapatılabilir, Görünüm Denetleyicisinde "Kaydırma Görünümü Eklerini Ayarla" onay kutusu bulunur. Uzun zamandır kafamı duvara vuruyorum, iOS 6 ve 7'yi destekleyerek daha da karmaşık hale gelen kaydırma görünümleri ve otomatik düzen ile ilgili sorunlarımı çözmeye çalışıyorum. Sonunda bir çözüm sağladığınız için çok teşekkürler!
Newtz

2
Uygulama belgesi, navigationbar.translucent = YES ayarının gezinme çubuğunun içeriği aşağı itmesini önleyeceğini söyleyecektir. Bu en büyük yalan ve bu gönderiye kadar bana saatlerce çalışmaya mal oldu. Buna ek olarak self.automaticallyAdjustsScrollViewInsets = NO; Bu yazı için çok teşekkür ederim !!!!!!! Elma ve elma mı?
user779764

Bunun UIScrollView sınırlarının gezinme çubuğunun yüksekliğine (-64 nokta) göre aşağı kaymasına neden olduğunu buldum. Bunu manuel olarak 0 olarak değiştirdim, ancak UISrollView'ün hala y ekseninde kayacağını ve -64'te hayali bir çizgiye "yapışacağını" buldum. Sizin çözümünüz bunu çözdü.
gdbj

92

@ Justafinger'ın cevabı benim için de bir cazibe merkezi oldu.

Sadece bu ayarın arayüz oluşturucudan kolayca ayarlanabileceğini eklemek istedim.

  1. Görünüm denetleyicinizi seçin
  2. 'Nitelik Denetçisi' sekmesini tıklayın
  3. 'Kaydırma Görünümü Eklemelerini Ayarla' seçeneğinin işaretini kaldırın
  4. Zevk almak!

görüntü açıklamasını buraya girin


Görünüm Denetleyicisinde değil, UIScrollView özelliklerinde bu seçeneği aramak için yaş harcadı! Teşekkürler!
Dominic Williams

11

Aynı sorunla karşılaşıyordum, ancak arayüz oluşturucudaki ViewController'da bana buna neden olan oldukça garip bir özellik buldum. "Kenarları Uzat" onay kutuları kümesi vardır. "Üst Çubukların Altında" onayını kaldırdım ve her şey benim için düzgün bir şekilde düzenlenmeye başladı.


Evet, bu benim için "Kaydırma Görünümü Eklemelerini Ayarla" dan daha iyi çalıştı
Dmytro

2

AutomaticAdjustsScrollViewInsets öğesi YES (varsayılan ayar) olarak ayarlandığında, ios6 ve ios7 arasında kaydırma görünümü konumlandırmasında bir uyuşmazlık vardır, bu nedenle tutarlı olmaları için bu ayarı devre dışı bırakmanız gerekir. Ancak, ios6, otomatik olarak ayarlanırsa çökecektir.AdjustsScrollViewInsets, bu nedenle, ya ios7'de programatik olarak automaticAdjustsScrollViewInsets değişikliği yapmanız ya da storyboard / NIB kullanarak seçeneği kapatmanız gerekir.


2

Benzer bir sorunla karşılaştım, bir viewController'ı kapattıktan sonra, tableView'daki contentOffset (0, -64) olarak değiştirildi.

benim çözümüm biraz garipti, diğer tüm cevapları denedim ama başarılı olamadım, sorunumu çözen tek şey .xib'in kontroller ağacındaki tableView konumunu değiştirmekti.

bu, ana görünümdeki ilk kontroldür:

önce

TableView'ı ImageView'den hemen sonra taşıdım ve çalıştı:

sonra

Tablo görünümünü ilk konuma yerleştirmek soruna neden oluyordu ve tablo görünümünü başka bir konuma taşımak sorunu çözdü.

PD autoLayout ne de storyboard kullanmıyorum

umarım bu birine yardımcı olabilir!


Bu garip davranışı fark ettim, inanıyorum ki arkasındaki mantık, scrollView ilk alt öğe olduğunda scrollViewInsets'in otomatik olarak ayarlanmasıdır. Aksi takdirde bu gerçekten bir anlam ifade etmiyor çünkü kaydırma görünümünüz muhtemelen tam ekran değil.
Streem

1

Ben de bu sorunla karşı karşıyayım.

UIScrollView içerik boyutu işletim sistemi tarafından diğer boyutlar gibi hesaplanır, kökenler kısıtlama sistemi tarafından sağlanır - bu nedenle işletim sisteminin şüphesi vardır.

Nasıl düzeltilir? Aşağıdakilerin içerik boyutunu açıkça tanımlamalısınız UIScrollView:

  1. Kaydırılabilir içeriği şuraya yerleştir UIView(adını değiştirdim ContentView)
  2. Kısıtlamalar ekleyin:

ContentView.Weight = View.Weight ve ContentView.Height = View.Height

görüntü açıklamasını buraya girin


0

Görünüşe göre bir çözüm, film şeridi dosyasını "iOS 6.1 ve öncesi" olarak görüntülemek gibi görünüyor (film şeridi dosyası -> Dosya denetçisi-> Arayüz Oluşturucu Belgesi-> Farklı Görüntüle'yi seçin. Alt görünümleri bu modda konumlandırmak ofseti gösterir.


Ben film şeridi kullanmıyorum. Ancak bunun bir ios6 ila ios7 sorunu olduğundan emin değilim, yukarıdaki örnek tamamen iOS 7 ile oluşturulmuştur. Üstelik sorumu düzenledim, yalnızca uiscrollview ve uitableview ile (bildiğim kadarıyla) görünüyor.
Streem

Hmm ilginç ... Buna bakarak, yukarıda bahsettiğim biti çevirirken aradaki fark olduğundan, belge öğesindeki XIB'nin üstüne variant = "6xAndEarlier" ekleyebilirsiniz. Ve bilginize bu sorun uiwebview için de benim için de oluyor.
swhitman

0

Çözümler için teşekkürler arkadaşlar! Sorunu çözmeye çalışırken saatlerce mücadele ettim. Gezinme Çubuğu olmadığında her şey yolundaydı, ancak ViewController'ı bir NavigationController'a yerleştirdiğim anda işler karıştı.

Kaydırma Görünümü Eklemelerini Ayarla ve Üst Çubuklar'ın işaretini kaldırarak çözdüm . Bunların her ikisi de ViewController's Attribute Inspector'da bulunur. Milyonlarca kez teşekkürler!

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.