iOS 8 UITableView ayırıcı eki 0 çalışmıyor


662

Ben UITableView's ayırıcı ek özel değerlere ayarlanmış bir uygulama var - Sağ 0, Sol 0. Bu mükemmel çalışır iOS 7.x, ancak iOS 8.0ayırıcı iç metin 15sağda varsayılan olarak ayarlanmış olduğunu görüyorum . Ayarlanmış xib dosyalarında olmasına rağmen 0hala yanlış görünüyor.

UITableViewCellAyırıcı kenar boşluklarını nasıl kaldırabilirim ?


İç metinleri 0 yerine 0.001 olarak ayarlamayı denediniz mi? Kenar ekinin 0'a tepki vermeyeceği, ancak 0.001'e (veya benzer küçük bir şeye) tepki verdiği benzer bir sorun yaşadığımı hatırlıyorum.
freshking

Bunu denedim ve o da işe yaramadı ..
user3570727

4
Sonra ayırıcıların rengini ayarlamanızı [UIColor clearColor]ve kendi ayırıcılarınızı çizmenizi öneririm . Bu şekilde çok daha esneksiniz.
freshking

1
Hala bunun UITableViewCellSeparatorStylevarsayılanlardan biri olmadığına inanamıyorum . Kabul edilen cevap bile bence gerçekten kirli bir saldırı.
Enrico Susatyo

Yanıtlar:


1071

iOS 8.0, hücreler VE tablo görünümlerinde layoutMargins özelliğini sunar.

Bu özellik iOS 7.0'da mevcut olmadığından, atamadan önce kontrol ettiğinizden emin olmanız gerekir!

Kolay düzeltme, hücrenizi alt sınıflara ayırmak ve @ user3570727 tarafından önerildiği gibi düzen kenar boşluklarını geçersiz kılmaktır. Ancak, aşağıdaki çözümü önermediğim için Güvenli Alandan kenar boşluklarını devralma gibi sistem davranışlarını kaybedersiniz:

(ObjectiveC)

-(UIEdgeInsets)layoutMargins { 
     return UIEdgeInsetsZero // override any margins inc. safe area
}

(hızlı 4.2):

override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }

Özelliği geçersiz kılmak istemiyorsanız veya koşullu olarak ayarlamanız gerekiyorsa, okumaya devam edin.


Özelliğe ek olarak layoutMarginsApple, hücrenize Tablo Görünümü'nün kenar boşluğu ayarlarını devralmasını önleyecek bir özellik ekledi . Bu özellik ayarlandığında, hücrelerinizin tablo görünümünden bağımsız olarak kendi kenar boşluklarını yapılandırmasına izin verilir. Bunu bir geçersiz kılma olarak düşünün.

Bu özellik çağrılır preservesSuperviewLayoutMarginsve NOhücrenin layoutMarginayarının layoutMarginTableView'da ayarlanan her şeyi geçersiz kılmasına izin verir . Hem zaman kazandırır ( Tablo Görünümünün ayarlarını değiştirmeniz gerekmez ), hem de daha özlüdür. Ayrıntılı bir açıklama için lütfen Mike Abdullah'ın cevabına bakınız.

NOT: Aşağıda, Mike Abdullah'ın cevabında ifade edildiği gibi, hücre düzeyinde bir marj ayarı için temiz bir uygulama yer almaktadır . Hücrenizin ayarlanması, preservesSuperviewLayoutMargins=NOTablo Görünümünüzün hücre ayarlarını geçersiz kılmamasını sağlar. Tüm tablo görünümünüzün tutarlı kenar boşluklarına sahip olmasını istiyorsanız, lütfen kodunuzu buna göre ayarlayın.

Hücre kenar boşluklarınızı ayarlayın:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Remove seperator inset
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
           [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

Hızlı 4:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // Remove seperator inset
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    // Prevent the cell from inheriting the Table View's margin settings
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    // Explictly set your cell's layout margins
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = .zero
    }
}

Ayar preservesSuperviewLayoutMarginsNO hücrenden mülk gerektiğini cep marjlarını geçersiz adresinin tablo görünümüne engeller. Bazı durumlarda, düzgün çalışmıyor gibi görünüyor.

Hepsi başarısız olursa, Tablo Görünümü kenar boşluklarınızı kaba kuvvet uygulayabilirsiniz:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    // Force your tableview margins (this may be a bad idea)
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
} 

Hızlı 4:

func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // Force your tableview margins (this may be a bad idea)
    if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
        tableView.separatorInset = .zero
    }
    if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
        tableView.layoutMargins = .zero
    }
}

... ve işte gidiyorsunuz! Bu iOS 7 ve 8'de çalışmalıdır.


DÜZENLEME: Mohamed Saleh dikkatimi iOS 9. değişiklik olabileceğini getirdi Sen Tablo Görünümü adlı ayarlamak gerekebilir cellLayoutMarginsFollowReadableWidthiçin NOsize-parçalar veya kenar boşluklarını özelleştirmek isterseniz. Kilometreniz değişebilir, bu çok iyi belgelenmemiştir.

Bu özellik yalnızca iOS 9'da bulunmaktadır, bu yüzden ayarlamadan önce kontrol ettiğinizden emin olun.

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 

Hızlı 4:

if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
    myTableView.cellLayoutMarginsFollowReadableWidth = false
}

( iOS 8 UITableView ayırıcı iç metin 0'dan yukarıdaki kod çalışmıyor )

EDIT: İşte saf bir Arayüz Oluşturucu yaklaşım:

TableViewAttributesInspector TableViewCellSizeInspector

NOT: iOS 11 bu davranışın çoğunu değiştirir ve basitleştirir, bir güncelleme gelecek ...


2
Bir UIPopoverController içindeki tablo görünümleri için, sadece willDisplayCell yerine, yukarıda gösterildiği gibi her ikisini de yapmak zorunda kaldım.
Zhang

44
Ayrıca yukarıdaki tüm kod rağmen hala cell.preservesSuperviewLayoutMargins = NO@ bffmike'ın önerisi başına eklemek zorunda ya da insets görünecek bir yol kaydırma sonra bulundu. (wtf ??)
inorganik

Kenar boşluğunu, gruplandırılmış bir tableView öğesinde yalnızca bir hücre türü için ayarlamak istersek ne olur?
SAHM

Bunu willDisplayCell'de ayarlamayı ve bunun gerçekten işe yarayıp yaramadığını görmeyi deneyebilirsiniz (önemsiz olması için hücrede bir tutamağa sahipsiniz). Başlamazsa, bir hata bildirmemiz gerekir. Hücreye özgü düzen kenar boşlukları mümkün olmalıdır, IMO.
cdstamper

2
Bu cell.preservesSuperviewLayoutMarginsbenim veri kaynağı yöntemi eklenmesi ile benim için çalıştı :- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
mts

257

Arg !!! Bunu Cellalt sınıfınızda ya oynadıktan sonra :

- (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsZero;
}

veya cell.layoutMargins = UIEdgeInsetsZero;düzeltmeyi benim için ayarladım .


13
bu cevaptaki ilk çözüm benim için çalıştı, ikincisi işe yaramadı.
spybart

5
Etmeyin , sadece cell.layoutMargins = UIEdgeInsetsZero kullanın; iOS 7.x'te kilitleneceğinden. Kullanmadan önce seçicinin var olup olmadığını kontrol etmek daha iyidir. Aşağıdaki çözümüme bakın.
Ricky

3
Cell.layoutMargins ayarlamıyor ... Özel çözümleriniz olduğunda bu çözüm harika çalışıyor.
Sjoerd Perfors

11
Bu yöntem çağrılmadığından iOS 7'de iyi çalışır! Yine de, tablo görünümünün layoutMargins öğesini ayarlamanız gerekir, aksi takdirde çalışmaz.
cdstamper

2
erişimci geçersiz kılmak benim için çalıştı. ama diğer tüm çözümler işe yaramadı. hatta separatorInsetIB'de yapılandırma işe yaramadı. ayrıca tablo görünümü arka plan renkleri ile ilgili bir sorun var. bu gerçekten hasta şeyler.
glasz

178

Düzeltmeye çalışmak için körü körüne şarj etmeden önce sorunu anlayalım.

Hata ayıklayıcıdaki hızlı bir dürtme, ayırıcı çizgilerin alt görünümleri olduğunu söyleyecektir UITableViewCell. Görünüşe göre hücrenin kendisi bu çizgilerin yerleşimi için oldukça fazla sorumluluk alıyor.

iOS 8, düzen kenar boşlukları kavramını sunar . Varsayılan olarak, bir görünümün düzeni marjları olan 8pther tarafta ve onlar konum miras atası görünümlerinden.

Söyleyebileceğimiz en iyi şekilde, ayırıcı çizgisini ortaya koyarken UITableViewCell, sol eki sınırlamak için kullanarak sol düzen kenar boşluğuna uymayı seçer.

Tüm bunları bir araya getirerek, istenen sıfır değerini eklemek için aşağıdakileri yapmamız gerekir:

  • Sol düzen kenar boşluğunu şu değere ayarlayın: 0
  • Devralınan marjları geçersiz kılma

Böyle söyleyin, başarmak oldukça basit bir iş:

cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;

Dikkat edilmesi gerekenler:

  • Bu kodun hücre başına yalnızca bir kez çalıştırılması gerekir (sonuçta hücrenin özelliklerini yapılandırırsınız) ve çalıştırmayı seçtiğinizde özel bir şey yoktur. Size en temiz olanı yapın.
  • Ne yazık ki hiçbir özellik Interface Builder'da yapılandırılamaz, ancak istenirse kullanıcı tanımlı bir çalışma zamanı özelliği belirtebilirsiniz preservesSuperviewLayoutMargins.
  • Açıkçası, uygulamanız önceki işletim sistemi sürümlerini de hedefliyorsa, iOS 8 ve sonraki sürümlerde çalışana kadar yukarıdaki kodu yürütmekten kaçınmanız gerekir.
  • Ayardan ziyade preservesSuperviewLayoutMargins, ata görünümlerini (tablo gibi) da kenar boşluğu bırakacak şekilde yapılandırabilirsiniz 0, ancak bu, tüm hiyerarşiyi kontrol etmediğiniz için doğası gereği daha fazla hataya açık görünüyor.
  • Muhtemelen sadece sol kenar boşluğunu ayarlamak 0ve diğerlerini bırakmak biraz daha temiz olacaktır.
  • UITableViewDüz stil tablolarının altında çizilen "ekstra" ayırıcılarda 0 iç metin istiyorsanız , tablo düzeyinde de aynı ayarları belirtmeyi gerektireceğini tahmin ediyorum (bunu denemedim!)

3
Teşekkür ederim! Bu gerçekten daha özlü bir cevap. İki yöntemi ve kaba zorlamayı geçersiz kılmaktan çok daha iyi.
LunaCodeGirl

16
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
İOS

1
Oyumu sen aldın, açık açıklama için teşekkürler. Ben sadece TableView kendisi de bazı durumlarda separatorInset ek olarak ayarlanması gerekebilir layoutMargins olduğunu anlatacağım.
cdstamper

@ davetw12 ve @cdstamper Buna dair bir kanıt sunabilir misiniz? Bütün keşifler bugüne kadar hem ayar söylemek layoutMarginsve preservesSuperviewLayoutMarginshücre üzerinde yapılması gereken tek şey olduğunu. Başka bir şey vuduya güvenmek gibi geliyor.
Mike Abdullah

3
Hayır, @MikeAbdullah'ın bir tür vudu değil. Eğer varsayılan önlemek için amacıyla separatorInseta UITableViewCelliOS 8'de, sen seti belirlemek zorunda UIEdgeInsetshem sıfıra UITableViewve UITableViewCell. Her ikisini de yapmazsanız, yine de sıfırdan büyük bir sol girişiniz olur. Bunu defalarca onayladım.
davetw12

58

Ben burada sordum aynı soru olduğuna inanıyorum: iOS 8'de SeparatorInset Kaldır XCode 6 iPhone Simulator için UITableView

Gelen iOS 8 , devralan tüm nesneler için yeni bir özellik vardır UIView. Bu nedenle, SeparatorInsetiOS 7.x'te ayarlama çözümü , iOS 8'deki UITableView'da gördüğünüz beyaz alanı kaldıramayacak.

Yeni özelliğe " layoutMargins " adı verilir .

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference

iOS 8 UITableView setSeparatorInset: UIEdgeInsetsZero setLayoutMargins: UIEdgeInsetsZero

Çözüm:-

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }

   if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
   }
}

cell.layoutMargins = UIEdgeInsetsZero;Var olup olmadığını kontrol etmeden ayarlarsanız layoutMargins, uygulama iOS 7.x'te kilitlenir. Yani, en iyi yol layoutMarginsönce var olup olmadığını kontrol etmektir setLayoutMargins:UIEdgeInsetsZero.


Dağıtım hedefi iOS 7 olarak ayarlanmışsa bu yaklaşım nasıl kullanılabilir?
Petar

Ben viewDidLoad tableView kodunu koymak ve iyi çalışıyor. Ben willDisplayCell () her zaman onları aramak için gerekli olmadığını düşünüyorum.
Abdullah Umer

46

Varsayılan genel ayarlar olarak ayarlamak için UIApearance'i uygulama başlangıcınızda (kullanıcı arayüzü yüklenmeden önce) bir kez kullanabilirsiniz:

// iOS 7:
[[UITableView appearance] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];

[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];

// iOS 8:
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {

    [[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];

}

Bu şekilde UIViewController kodunuzu temiz tutar ve isterseniz her zaman geçersiz kılabilirsiniz.


41

iOS, hücreler VE tablo görünümlerinde layoutMargins özelliğini sunar.

Bu özellik iOS 7.0'da mevcut olmadığından, atamadan önce kontrol ettiğinizden emin olmanız gerekir!

Ancak, Apple eklemiştir mülkiyet denilen preservesSuperviewLayoutMargins sizin Tablo View'in marjı ayarlarını devralmaya engellemek olacaktır hücreye. Bu şekilde, hücreleriniz tablo görünümünden bağımsız olarak kendi kenar boşluklarını yapılandırabilir. Bunu bir geçersiz kılma olarak düşünün.

Bu özellik denir preservesSuperviewLayoutMargins ve NO değerine ayarlayarak kendi hücrenin layoutMargin ayarı ile Masa View'in layoutMargin ayarlarını geçersiz kılmak için izin verebilirsiniz. Her ikisi de zaman kazandırır ( Tablo Görünümü'nün ayarlarını değiştirmeniz gerekmez ), hem de daha özlüdür. Ayrıntılı bir açıklama için lütfen Mike Abdullah'ın cevabına bakınız.

NOT: Mike Abdullah'ın cevabında ifade edildiği gibi, bu daha az dağınık bir uygulamadır; hücrenizin protesSuperviewLayoutMargins = NO ayarının yapılması, Tablo Görünümünüzün hücre ayarlarını geçersiz kılmamasını sağlar.

İlk adım - Hücre kenar boşluklarınızı ayarlayın:

/*
    Tells the delegate that the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Remove separator inset
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }

    // Explictly set your cell's layout margins
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
}

Hücrenizdeki protesSuperviewLayoutMargins özelliğini NO olarak ayarlamak gerekir cep marjlarını geçersiz adresinin tablo görünümüne engeller. Bazı durumlarda, düzgün çalışmıyor gibi görünüyor.

İkinci adım - Yalnızca tümü başarısız olursa, Tablo Görünümü kenar boşluklarınızı kaba kuvvet uygulayabilirsiniz:

/*
    Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Force your tableview margins (this may be a bad idea)
    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }

    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
}

... ve işte gidiyorsunuz! Bu, iOS 8'in yanı sıra iOS 7'de de çalışmalıdır.

Not: iOS 8.1 ve 7.1 kullanılarak test edildi, benim durumumda bu açıklamanın sadece ilk adımını kullanmam gerekiyordu.

İkinci Adım, yalnızca oluşturulan hücrelerin altında doldurulmamış bir hücreniz varsa gereklidir. tablo, tablo modelindeki satır sayısından büyükse. İkinci adımın yapılmaması farklı ayırıcı ofsetleriyle sonuçlanır.


1
willDisplayCellYöntemin kendisi zaten iOS 8+ olduğundan ve asla eski sürümlerden çağrılmayacağından yöntemdeki seçicileri kontrol etmeniz gerekmez .
Rivera

38

Swift'te layoutMarginsbir özellik olduğu için biraz daha can sıkıcıdır , bu yüzden alıcı ve ayarlayıcıyı geçersiz kılmalısınız.

override var layoutMargins: UIEdgeInsets {
  get { return UIEdgeInsetsZero }
  set(newVal) {}
}

Bu etkili bir şekilde layoutMarginssalt okunur hale getirecek , ki bu benim durumumda iyi.


Sadece bu çözüm benim için işe yaradı. Ve yöntemlerde satırları ek kod eklemek gerek yoktu. Özel hücreler kullandım.
Ramis

2
StaticMargins'i geçersiz kılmak dışında statik hücre için, hücrenin ayırıcı stilini "Özel Ekler" olarak değiştirmeniz ve film şeridinde sol değeri "0" olarak ayarlamanız gerekir.
hufeng03

22

İOS 9 için şunları eklemeniz gerekir:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 

Daha fazla ayrıntı için lütfen soruya bakın .


12
ilk görünüm aynı kalır, böylece her sürüm için bazı kod eklemek komik ...
Christian

20

Swift 2.0 Uzantısı

Sadece tablo görünümü hücre ayırıcılarından kenar boşluklarını kaldırmak için yaptığım bir uzantıyı paylaşmak istedim.

extension UITableViewCell {
    func removeMargins() {

        if self.respondsToSelector("setSeparatorInset:") {
            self.separatorInset = UIEdgeInsetsZero
        }

        if self.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
            self.preservesSuperviewLayoutMargins = false
        }

        if self.respondsToSelector("setLayoutMargins:") {
            self.layoutMargins = UIEdgeInsetsZero
        }
    }
}

Bağlamda kullanılır:

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell

    cell.removeMargins()
    return cell

15

Swift:

override func viewDidLoad() {
    super.viewDidLoad()

    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }
    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }

    self.tableView.layoutIfNeeded()            // <--- this do the magic
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     ...

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }

    return cell
}

11

Bunu yaparak çalıştım:

tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;

9

Tablo görünümü yerine cdstamper'ın önerdiği gelince, hücrenin layoutSubview yöntemine aşağıdaki satırları eklemek benim için işe yarar.

- (void)layoutSubviews 
{
    [super layoutSubviews];

    if ([self respondsToSelector:@selector(setSeparatorInset:)])
                [self setSeparatorInset:UIEdgeInsetsZero];

        if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
        {
            [self setPreservesSuperviewLayoutMargins:NO];;
        }

        if ([self respondsToSelector:@selector(setLayoutMargins:)]) 
        {
            [self setLayoutMargins:UIEdgeInsetsZero];
        }
}

9

Swift 3.0 örneği:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // removing seperator inset
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    // prevent the cell from inheriting the tableView's margin settings
    if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    // explicitly setting cell's layout margins
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = .zero
    }
}

9

Çok araştırmadan sonra ...

Bu şeyleri tam olarak kontrol etmenin tek yolu (bulabildiğim)

Her bir hücredeki ayırıcı eklerini ve düzen kenar boşluklarını tam olarak denetlemek için. Bunu willDisplayCellyönteminizde yapın UITableviewDelegate.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.layoutMargins = UIEdgeInsetsZero
    cell.contentView.layoutMargins = UIEdgeInsetsMake(0, 10, 0, 10)
    cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}

Hücre nesnesi ayırıcıyı kontrol eder ve diğer contentViewher şeyi kontrol eder. Ayırıcı iç alanlarınız beklenmedik bir renkte görünüyorsa, bu sorunu çözmelidir:

cell.backgroundColor = cell.contentView.backgroundColor

8

Özelleştirilmiş iOS 8 için Swift'te basit çözümUITableViewCell

override func awakeFromNib() {
    super.awakeFromNib()

    self.layoutMargins = UIEdgeInsetsZero
    self.separatorInset = UIEdgeInsetsZero
}

Bu şekilde ayarlarken layoutMarginve separatorInsetsadece bir kez yerine her biri için bunu yaparken willDisplayCellyukarıdaki cevapların çoğu önerdiği gibi.

Bir özel kullanıyorsanız UITableViewCell, bunu yapmak için doğru yerdir. Aksi takdirde bunu yapmalısınız tableView:cellForRowAtIndexPath.

Başka bir ipucu: Ayarlamanız gerekmez, preservesSuperviewLayoutMargins = falseçünkü varsayılan değer zaten NO!


8

Benim için basit çizgi işi yaptı

cell.layoutMargins = UIEdgeInsetsZero

bunu cellForRowAtIndexPath delege yönteminde çağırdı. İyi cevap :)
saintjab

7

Sadece aşağıdaki kodu ekleyin bu programı çözebilir.

Sana iyi şanslar!

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

       if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
           [cell setSeparatorInset:UIEdgeInsetsZero];
       }

       if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
           [cell setLayoutMargins:UIEdgeInsetsZero];
       }

}

5

Swift'te Lukasz cevabı:

    // iOS 7:
    UITableView.appearance().separatorStyle = .SingleLine
    UITableView.appearance().separatorInset = UIEdgeInsetsZero
    UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero

    // iOS 8:
    if UITableView.instancesRespondToSelector("setLayoutMargins:") {
        UITableView.appearance().layoutMargins = UIEdgeInsetsZero
        UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero
        UITableViewCell.appearance().preservesSuperviewLayoutMargins = false
    }

5

Swift'te benim için çalışan kod:

override func viewDidLoad() 
{
    super.viewDidLoad()
    ...
    if tableView.respondsToSelector("setSeparatorInset:") {
        tableView.separatorInset = UIEdgeInsetsZero
    }
}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath)
{
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset.left = CGFloat(0.0)
    }
    if tableView.respondsToSelector("setLayoutMargins:") {
        tableView.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins.left = CGFloat(0.0)
    }
}

Tüm hücre / tableView kenar / kenar boşluğu ayarlamaları, tableView:willDisplayCell:forRowAtIndexPath:gereksiz kod içine girmeden yöntemde yapıldığı için (şimdilik) bu benim için en temiz görünüyor tableView:cellForRowAtIndexPath:.

Btw, sadece hücrenin sol separatorInset / layoutMargins ayarlıyorum, çünkü bu durumda hücremde kurduğum kısıtlamaları berbat etmek istemiyorum.

Kod Swift 2.2 olarak güncellendi:

 override func viewDidLoad() {
   super.viewDidLoad()       

    if tableView.respondsToSelector(Selector("setSeparatorInset:")) {
      tableView.separatorInset = UIEdgeInsetsZero
        }
    }

 override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
        if cell.respondsToSelector(Selector("setSeparatorInset:")) {
            cell.separatorInset.left = CGFloat(0.0)
        }
        if tableView.respondsToSelector(Selector("setLayoutMargins:")) {
            tableView.layoutMargins = UIEdgeInsetsZero
        }
        if cell.respondsToSelector(Selector("setLayoutMargins:")) {
            cell.layoutMargins.left = CGFloat(0.0)
        }
    }

Sizin için tam olarak işe yaramayan nedir? Bu kodu iOS 8.1 SDK yüklü olarak iPhone 5 simülatöründe test ettim ve her şey bu cevabı ilk olarak gönderdiğimde olduğu gibi. Kod derlendi ve Xcode 6.1.1 ile çalıştırıldı.
Ivan

4

Çoğu cevaplar ayırıcı-parçalar gösteriyor ve düzen marjları yöntemlerle (yani çeşitli üzerinde belirlenmesini viewDidLayoutSubviews, willDisplayCellhücreler ve tableviews için, vs), ama sadece bu koyarak saptadık cellForRowAtIndexPathharika işler. En temiz yol gibi görünüyor.

// kill insets for iOS 8
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
    cell.preservesSuperviewLayoutMargins = NO;
    [cell setLayoutMargins:UIEdgeInsetsZero];
}
// iOS 7 and later
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
    [cell setSeparatorInset:UIEdgeInsetsZero];

4

Aşağıdaki kod snippet'ini kullanın, IOS 8 ve 7'de UITableView için istenmeyen dolgu sorunlarından kaçının.

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
    {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
    {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)])
    {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

4

Güncelleme yerine preservesSuperviewLayoutMarginsve layoutMarginshücre her girdiğinde (kullanarak willDisplayCell), bunu bir kez yapmayı öneririm cellForRowAtIndexPath::

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)

    cell.preservesSuperviewLayoutMargins = false
    cell.layoutMargins = UIEdgeInsetsZero

    return cell

}

4

İşte iç kısmı global olarak kaldırmanın kolay bir yolu.

İçinde UITableViewCell+Extensions.swift:

import UIKit

extension UITableViewCell {

  override public var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set { }
  }

}

İçinde AppDelegate application:didFinishLaunchingWithOptions::

  UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero

Ayrıca a) separatorInsetuzantıda geçersiz kılmayı veya b) layoutMarginsbunun yerine görünüm proxy'sini ayarlamayı düşünebilirsiniz . İkisi de işe yaramayacak. Olsa separatorInsetbir özellik (veya yönteme) olarak geçersiz derleyici hataları oluşturduğunu çalışırken, bir özellik olduğu belirtilmiştir. Ve görünüm proxy'sini UITableViewCell's için layoutMargins(veya bu nedenle, görünüm proxy'lerini UITableView' s layoutMarginsve için separatorInset) ayarlamanın hiçbir etkisi yoktur.


3

İOS8'de:

Bunu UITableViewCell Alt Sınıfıma ekleme:

- (UIEdgeInsets)layoutMargins {
    return UIEdgeInsetsZero;
}

ve bu "tableView: cellForRowAtIndexPath" veya "tableView: willDisplayCell" için:

[editCell setSeparatorInset:UIEdgeInsetsZero];

Benim için çalıştı.


2
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        // ... Get the cell
        cell.separatorInset = UIEdgeInsetsMake(0.f, 20.f, 0.f, [UIScreen mainScreen].bounds.size.width - 20);
        // others
        return cell;
}

Ayırıcıyı gizlemek istediğiniz belirli bir hücre için.


2

3. katta cevapları gördükten sonra, TableView ve TableViewCell arasında ayırıcı kurma ilişkisinin ne olduğunu anlamaya çalıştım ve bazı testler yaptım. İşte sonuçlarım:

  1. hücrenin ayırıcısını sıfıra ayarlamanın ayırıcıyı iki adımda hareket ettirmesi gerektiğini düşünebiliriz: ilk adım, hücrenin ayırıcı kümesini sıfıra ayarlamaktır . ikinci adım hücrenin kenar boşluğunu sıfıra ayarlamaktır .

  2. TableView ayırıcısetini ayarlayın ve kenar boşluğu Hücre ayırıcısetini etkileyebilir . Ancak, testten, ben Tableview en bulmak separatorinset yararsız görünmektedir, Tableview en marginlayout aslında hücrenin etkileyebilir marginlayout .

  3. set Cell's PreservesSuperviewLayoutMargins = false, TableView'ın Hücrelerdeki kenar boşluğu efektini kesebilir .

  4. çözümlerden biri:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell()
    
        cell.preservesSuperviewLayoutMargins = false
        cell.separatorInset = UIEdgeInsetsZero
        cell.layoutMargins = UIEdgeInsetsZero
    
        return cell
    }

2

Bu benim çözümüm. Bu, özel hücre alt sınıfı için geçerlidir, her ikisini de alt sınıfa eklemeniz yeterlidir.

  1. - (UIEdgeInsets)layoutMargins {    
        return UIEdgeInsetsMake(0, 10, 0, 10);
    }

2.

self.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10);

Ve tasarımcıdan sizin için bir tane çizmesini istemeden ayırıcı konumunu özelleştirebilirsiniz.


1

En çok oy verilen cevaptan daha kompakt bir şekilde ...

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([cell respondsToSelector:@selector(setSeparatorInset:)] && [cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)] && [cell respondsToSelector:@selector(setLayoutMargins:)]) {
         [cell setSeparatorInset:UIEdgeInsetsZero];
         [cell setPreservesSuperviewLayoutMargins:NO];
         [cell setLayoutMargins:UIEdgeInsetsZero];
    }

}


1

Swift'teki bu zarif parçacığı eklemek, iOS8'de benim için çalışıyor :)

    // tableview single line
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.preservesSuperviewLayoutMargins = false
    cell.layoutMargins = UIEdgeInsetsZero
}

1

Bu, iOS 8 ve iOS 9'da benim için mükemmel çalıştı.

İçin OBJ-C

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  { 
        if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
        {
            [tableView setSeparatorInset:UIEdgeInsetsZero];
        }

        if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
        {
            [tableView setLayoutMargins:UIEdgeInsetsZero];
        }

        if ([cell respondsToSelector:@selector(setLayoutMargins:)])
        {
            [cell setLayoutMargins:UIEdgeInsetsZero];
        }
         return cell;
    }
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.