UITableView, iOS 7'de bir ofset ile başlıyor


115

Düz bir jane UITableView'ı iOS 7'de bir UIViewController'a sürükledim.

Şimdi, ilk hücre başlamadan önce dikey bir boşluk kayması var. Ondan nasıl kurtulurum? İlk satırın, UITableView'ün gerçekte başladığı yerin üst kenarına çok daha yakın olmasını istiyorum. Ben büyük ofset istemedim değil mi?

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

Herhangi bir fikir?


43
Bana şu konuda yardımcı oldu: YouStoryboard.storyboard> YouViewController> Nitelikler denetçisi> Uncheck - Kaydırma görünümü eklerini ayarla.
Alexander

17
btw, iOS Simulator'un ekran görüntüsünü Command tuşu + S
Hemang

@Alexander: Önerilerinize de yardımcı oldum, ancak ExtendEdges.UnderTopBars'ın işaretinin kaldırılması yine dikey ofset alanının görünmesine neden oldu. Bunun Xcode6'daki (birçok?) Hatadan biri olup olmadığından emin değilim, ancak bu sorunlar arada bir başımı ağrıtıyor!
iOS-Coder

Yanıtlar:


81

Varsayılan olarak tablo görünümü denetleyicileri, içeriği gezinme çubuğunun altına doldurur, böylece altındaki içeriği kaydırabilir ve gezinme çubuğunun / araç çubuğunun altında bulanık bir durumda görebilirsiniz.

Gezinme çubuğunun altından dışarı taşımak için 44 (belki 64) piksele konumlandırıyorsunuz gibi görünüyor, ancak bunu zaten telafi ediyor, bu yüzden büyük bir boşluk elde edersiniz.

IB'deki storyboard / xib'e gidin ve gezinme çubuğu öğesinin altındaki şov içeriğinin işaretini kaldırın.


6
Pardon, iOS7'de NDA hakkındaki yorum nasıl alakasız? Bu, insanlara yardım etmek için bir forumdur.
Cocoadelica

Viewcontroller'daki Xcode Sürüm 5.1'de, uzatılmış kenarların işaretini kaldırın> Üstteki UITableView içerik ekini kaldırmak için üst çubukların altında
Emel Elias

3
Peki, gezinti çubuğu thigo altındaki şov içeriği nerede? Bulamıyorum
Anup Kattel

10
@FrankGorman Xcode 5.1.1'de belirli bir görünüm denetleyicisi için film şeridinde bir seçenek var, Adjust Scroll View insetsonay işaretini kaldırın.
korat prashant

1
hey @koratprashant. çok faydalı yorum.
KDeogharkar

107

UIViewController'ın yeni iOS 7 uygulaması , geliştiricinin, sistemin UIScrollView , UITableView ve türevler için otomatik olarak insets ekleyip eklemeyeceğini seçmesine olanak tanıyan yeni bir seçenekler kümesine sahiptir .

Bu davranışı devre dışı bırakmak için, UIViewController seçili nesne denetçisinde , InterfaceBuilder'da istediğiniz tüm UIViewControllers için bu kutuların işaretini kaldırın :

Controller Inspector'ı görüntüleyin

Daha fazla ayrıntı için:

  1. İOS 7 uygulamalarınızı bugün gönderin.
  2. iOS 7 UI Geçiş Kılavuzu> Görünüm ve Davranış

Teşekkürler! Beni kurtardın.
rsc

68

İOS7 geçiş kılavuzundan:

Bir kaydırma görünümünün içerik eklerinin otomatik olarak ayarlanmasını istemiyorsanız, otomatik olarak ayarlayınScrollViewInsets'i NO olarak ayarlayın. (AutomaticAdjustsScrollViewInsets'in varsayılan değeri YES'dir.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
Bu, öznitelik denetçisindeki XCode'da da ayarlanabilir. Adjust Scroll View InsetsGörünüm denetleyicisi düzeni için onay kutusunun işaretini kaldırın .
Andrew

1
UIViewController'ı programlı olarak (XIB kullanmadan) yüklerseniz, bu bir cazibe gibi çalışır. automaticallyAdjustsScrollViewInsets = NOGörünüm denetleyicisinde ayarlayın .
KabraBoja

Bu benim içindi. Kafa karıştırıcı çünkü benim TableView bir konteyner görünümündeydi ve başlangıçta iyi görünüyordu. Ancak başka bir görüntü denetleyicisinden geri döndüğünde hata yaptı.
n13

Harika! Bana çok zaman kazandırın!
inix

34

Benzer bir sorun yaşadı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!


Ben de aynı şeyi fark ettim! Herhangi bir ek görünüm koymuyorum, ancak UITableView -44'ün tepesini hareket ettiren boşluğu basitçe telafi ediyorum. IB'de -64px'i taşımam gerekiyor gibi görünüyor, ancak çalışma zamanında -64px, gezinti çubuğunun tablview overlay'ına neden oluyor ve -44px tamam. Bunu tam olarak açıklayamıyorum. Bu sorunu, iPhone film şeridinde benzer bir sorun fark etmediğimde iPad açılır pencere görünümünde buldum.
Mike Keskinov

Bu sorun, uiview ile bile ortaya çıkar. kullanıcı arayüzünde gösterilen görünüm aynı sıraya yerleştirilmezse.
Rinku

2
Bugün XCode 6.1 ile aynı sorunu yaşadım. Apple'ın böcekleriyle
uğraşarak

3
Bu son derece yardımcı oldu ve daha fazla ilgiyi hak ediyor! Görünüm denetleyici ayarları veya içerik eki / ofseti ile uğraşmak hiç yardımcı olmadı, ancak film şeridindeki görünümlerin sırasını değiştirmek benim için sorunu çözdü.
Caleb

1
Apple, yani ... WTF? Teşekkürler dostum, bu da otomatik düzen ile film şeridi düzeltildi.
Borzh

30

benzer sorunumu çözdü:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
Sistem versiyonunu şu şekilde kontrol etmelisiniz:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

Bu, yaşadığım boşluk sorunu için benim için çalıştı, ancak şimdi yenilemek için çekme kontrol döndürücüm kısmen gizlenmiş ve üst menümün altında görünüyor. Bunu da gören var mı? Herhangi bir geçici çözüm var mı?
Nick

@ nickv2002 programlı olarak tablo oluşturmayı deneyin
Alex

Diğer tüm çözümleri denedim ama sadece bu benim için çalıştı
DanielR

13

Bunu kullanmayı dene

tableView.separatorInset = UIEdgeInsetsZero;

Açıkçası, iOS7'den daha azını destekliyorsanız, nesneyi çağırmadan önce bu seçiciye yanıt verdiğinden emin olmanız gerekir.


4
bunun neden oylandığından emin değilim ... separatorInset yalnızca hücreler arasındaki uzaklık çizgilerini değiştirir, görünümün kenarından girilir. Soru, hücrelerin üstündeki ve altındaki boşluğu soruyor
Rembrandt Q. Einstein

Resim yanıltıcıdır, ancak kenar boşluğu sorunu için yapılan ortak bir Google araması bu sayfayı verir.
Will

9

Cidden, değiştirmek contentOffsetçözüm değil. Sadece bir sorunu yamalıyorsunuz ve sebebini çözmüyorsunuz. Aynı sorunla karşı karşıyayım ve gruplanmış tablo görünümlerinin üstte bir dolguya sahip olduğu ortaya çıktı . Benim durumumda, türü düz olarak ayarlamak hile yaptı.

Umarım birini birkaç dakika kurtarır. Z.


1
Tamamen özledim, cevabınızı bulduğuma sevindim, UPVOTE
AamirR

8

İOS 9 ile, bu sayfadaki diğer yanıtların hiçbiri benim için işe yaramadı (yani Storyboard'daki kutuların işaretini automaticallyAdjustsScrollViewInsetskaldırmak , olarak ayarlamak NO).

Gerçekten memnun olmadığım geçici çözümüm şuydu:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Aynı satırlar viewWillAppearya viewDidLoadetkisizdi.


Uitableviewcontroller iOS 9 için tek cevap bu olmalı .... gerçekten, başka hiçbir şey yardımcı olmadı ve hepsini denedim, bunu nerede buldunuz veya nasıl anladınız? birçok 10x
Erez

Onay Adjust Scroll View insetskutusunun işaretinin kaldırılması iOS 9'da çalışır.
Adam

Kaydırma Görünümü eklerini ayarla benim için başka bir çözüm çalışmıyor mu?
Yogesh Patel

5

Bazen, bir Gezinme Denetleyicisi içine gömülü 64olduğunda Tablo Görünümümün üst kısmında bir yükseklik boşluğu görüyorum UIViewController.

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

Geçmişte, kısıtlamaların temiz bir sayfadan sonra doğru çıkacağını umarak her şeyi yeniden yaratırdım.

TIL: için dikey bir sınırlama yapmak istemiyorsanız, öğesine erişmek için tuşunu Top Layout Guidebasılı tutabilirsiniz .OptionContainer Margin

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

Ardından Top Space to Superviewsabitin olarak ayarlandığından emin olun 0. Bu en azından benim için çalıştı.

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


1,5 yıl sonra, ama bu benim akşamımı çözdü. Teşekkürler!
asp_net

4

Bu benim için çalışıyor:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

UITableView'dan önce boş bir UIView eklerseniz (veya ScrollView ve TextView gibi herhangi bir görünüm kaydırılabilirse), şansınız olabilir.


1

Bir konteyner görünümüne gömülü bir UITableViewController vardı. İstenmeyen 64 nokta dikey boşluktan kurtulmak için, Arabirim Oluşturucu'da 'Kaydırma Görünümü Eklemelerini Ayarla' seçeneğinin işaretini kaldırmam ve UITableViewController'ımın görünümündeWillAppear aşağıdaki gibi UITableView'un contentInset'ini ayarlamam gerekiyordu.

Dikey boşluğun boyutu, gezinme çubuğunun çerçeve yüksekliği ve y uzaklığı ile eşleşecek şekilde görünür. Sorun yalnızca iOS 7'de meydana geldi.

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

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

Xamarin iOS'ta, ön plan kalıcı iletişim kutusu kapatıldıktan hemen sonra arka planlı bir UITableViewController üzerinde bu sorunu yaşadım. Ön plana geçme sürecinde, UITableViewController'ın girintileri ayarlandı (iOS tarafından bir yerde):

Bu sınıf çözdü

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

Zaman zaman bu korkunç duruma geri dönüyorum ve hala bilinmediğini fark ediyorum. Yani, gelecekteki hafıza için ...

Son zamanlarda, bu geçici çözümü düzeltiyorum.

  1. UITableView’un üstüne sıfır piksel yüksekliğiyle bir alt görünüm ekleyin. Otomatik Düzen ile veya olmadan çalışır.
  2. Kendime güveniyorsam :-) Bu sahte görünümü kaldırırım, üstteki kısıtlamaları düzeltirim ve sihirli bir şekilde çalışır.

Neden diye sorma, hala UIKit'te derin bir hata olduğunu düşünüyorum.


0

Film şeridine giderseniz, tabloyu seçerek ofseti değiştirebilirsiniz ve Nitelikler denetçisindeki Tablo Görünümü bölümü altında soldaki Ayırıcı Insets'i 0 olarak değiştirirsiniz.


0

Bence gerçek çözüm, tableview üzerindeki üst ve alt kısıtlamalarınızın topMargin ve bottomMargin'e eşit olmasını sağlamaktır. Üst düzen kılavuzu ve alt düzen kılavuzu değil. Bu, otomatik olarakAdjustsScrollViewInsets'in doğru olmasını sağlar.


0

Swift 3 çözümü:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

TableViewController'ınızı bir NavigationController veya bir ContainerView'a katıştırdıysanız You have to constraint to margins instead of top Layout guide in Storyboard,. Check constraint to margins when you are doing the constraintsBenim için başka hiçbir yol çalışmadı. Yorum yapamadım, bu yüzden Robert Chens'in cevabını tekrar ediyorum.


0

Birkaç cevabı denedim. Film şeridindeki ayarları değiştirmek, soldan açılan bir kaplama menüsünde dalgalanma sorunlarına neden oldu.

Film şeridinde yalnızca boş bir UIViewController var, aksi takdirde her şey programla oluşturulur.

Bir UIViewController içindeki bir UIView içindeki bir UITableView ile aynı sorunu yaşıyorum. Yani, bölüm başlıkları, UIViewController bir Gezinme Denetleyicisine gömülü olduğunda çok aşağıdan başlar. Gezinme denetleyicisi olmadan her şey iyi çalışıyor.

Sorunu çözmek için bir UILabel oluşturdum ve kısıtlamalarla UILabel alt kısıtını yerleştirdim = UIView'ın üst kısıtlaması (bu yüzden ekranda gösterilmez. Şimdi bu ek kontrolle (yeni Etiket) TableView düzgün davranır.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

İOS 11 ve xib, UITableviewController'da da aynı problemi yaşadım ve aşağıdaki gibi çözdüm

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
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.