UITableView'da ayırıcı tam genişliği nasıl ayarlanır


149

UITableViewAyırıcıların tam genişliğe sahip olmadığı bir yerim var . Sol taraftan 10 piksel önce bitiyor. Ben bu kod ile oynuyordu viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Ayrıca film şeridinde özel veya varsayılan seçicileri seçebileceğiniz zaman. Artık doldurulan hücrelerin tümü tam genişlik seçicilerine sahip değil, ancak boş olan hücrelerin tam genişliği var.

Bunu nasıl düzeltebilirim?


9
UITableViewözelliği vardır separatorInset. UITableViewÇizgi ayırıcısının iç kısmını sıfıra ayarlayın. Ayrıca separatorInsetfilm şeridinden değiştirebilirsiniz
KRUKUSA

Yanıtlar:


220

Bu benim için Xcode 6.4 ve Swift 1.2 kullanan iOS 8.4 - 9.0 cihazlarında çalıştı:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Swift 5 Güncellemesi:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

Bu neden masamı boş bir tabloyla kaldırıyor? Seperatörler taşınır ama düğmelerimin hiçbirini göremiyorum
Oscar

1
@ James, lütfen "masamı boş bir tabloyla kaldır?" Düğmelerinizi nasıl eklediniz (IB, kod aracılığıyla)?
MB_iOSDeveloper

1
Çok güzel bir çözüm. Ama benim durumumda kodu doğrudan hücre başlatmaya koydum, çünkü tüm kontrolörlerde tam genişlikte ayırıcı olmasını istedim.
Vojta

Açık değilse, bu aynı zamanda uygun sözdizimi değişiklikleriyle Objective-C için de çalışır.
cohenadair

1
Bu çözümlerin hiçbiri iPad'de çalışmaz. Bu sadece bir iPhone üzerinde çalışıyor ...
Charles Robertson

103

Bu yazının cevabını aldım: iOS 8 UITableView separator inset 0 çalışmıyor

Sadece bu kodu UITableViewController

-(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];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

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

2
sadece tableView delege yöntemini eklemek için benim için çalışıyor
TonyTony

Özür dilerim üzgünüm. Yani TableViewDeleagte? Eklemeniz yeterliydi. Ben sadece benim için işe yaramadı ekleyerek çalıştı @TonyTony
Timo Cengiz

3
benim için yöntem viewDidLayoutSubviewsgerekli değil
TonyTony

Kodunuzu 8'den farklı IOS sürümleriyle çalıştırmayı denediniz mi? Belki de en yenileri için çalışır. Aksi takdirde işe yarar. Ben sadece tableview delege yöntemini eklemeyi denedim ve yardımcı olmadı. @TonyTony
Timo Cengiz

İkisini de kullanmak zorunda kaldım. Her birini tek tek başarılı olmadan kullanmayı denedim. Sadece ikisini de kullandığımda işe yaradı. Ayrıca, görünüm denetleyicim bir UITableViewController alt sınıfı ve UIViewController bir alt sınıf olduğunda denedim. Fark yok. 8.1 simülatöründe çalıştığımı unutmayın.
Ron

100

Sizin UITableViewCell

Arayüz Oluşturucunuzdaki Özellik Denetçisi'ne gidin ve "15" değerini 0 olarak değiştirin. Bunu değiştirmek istediğiniz tüm hücreler için yapın.

instets

Sen eklemeniz gerekebilir [cell setLayoutMargins:UIEdgeInsetsZero];için senintableViewCell


1
Veya bu garip. Bu benim için (teşekkür ederim!) UITableViewCells görüntülenmesi vardı satırlarda işe yaradı, ancak altındaki boş satırlarda, ayırıcı hala 15 piksel girintili.
Mike Gledhill

Statik hücreler kullanıyorsanız, sol eki görüntüde anlatıldığı gibi 0 olarak değiştirmek (iOS 10'da çalışma, Xcode 8.3.1)
Ignacio Valdivieso 15:17

29

Swift 3 için:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. Seçin UITableViewCell
  2. Özellik Denetçisine Git
  3. Git Ayırıcı ve bunu değiştirmek "Özel Metinleri'nde"
  4. Set leftve / veya rightalanlar. (Varsayılan olarak left: 15, right: 0)

Nasıl çalıştığına bakın (kullanarak left: 100):

resim açıklamasını buraya girin

Sonuç:

resim açıklamasını buraya girin


1
@Hannah Louisa Carney
Konstantin Salavatov '

19

Yanlış olarak ayarlamak için de UITableViewControlleriki giriş ayarından ek devralma ve buna ek gerekli . Swift'te şöyle görünür:willDisplayCellpreservesSuperviewLayoutMargins

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

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

preservesSuperviewLayoutMargins = falseVarsayılan değer zaten yanlış olduğu için ayarlamanız gerekmez
crubio

2
Bunun, hücrelerin tam yüksekliği oluşturmazsanız, denetleyicinin görüntülediği 'yer tutucu' hücrelerdeki ayırıcıları, hücrelerinizin altındaki görünümü doldurmak üzere ayarlamayacağını unutmayın.
Tieme

11

Ayırıcı Insetvarsayılan olarak soldan 15'tir. Değişim Ayırıcı Insetgelen seçenek autoiçin customilavesindeki ve set 0.

resim açıklamasını buraya girin


9

İOS 9 ve sonraki sürümlerinde Swift için

Özel kullanıyorsanız UITableViewCell:

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

sonra sizin UITableViewiçin viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

Benim için düzelten tek cevap bu (hızlı 3 olarak güncellendi). Ancak ... hücrede veri olduğunda çalışır. Henüz doldurulmamış boş hücreler için (ve sanırım bu geçersiz kılınan layoutMargins değişkeni olarak adlandırılmamış) ayırıcı hala tablo görünümünde benim özel hücrenin tam genişliğini doldurmuyor. Bununla ilgili bir fikrin var mı?
RanLearns

İPhone'da, ayırıcı boş hücrelerde soldan birkaç piksel ve sağdan birkaç piksel biter. Kenar boşluklarını sıfırlamak için bu hileyi kullanmadan iyi görünüyor. İPad'de asıl sorun - boş bir hücredeki ayırıcılar, tablo görünümünün sol kenarından, hücre genişliğinin sadece yaklaşık% 80'ine gider. Hücrede veri olduğunda, ayırıcı hala hücre genişliğinin% 80'i kadardır, ancak içeri girmenin% 20'sini başlatır ve
tablo görüntüsünün

1
Bir çözüm bulduk ... eğer #available (iOS 9, *) kullanarak {self.tableView.cellLayoutMarginsFollowReadableWidth = false} bunu yaptı, bu yüzden iPhone'da kodunuza hiç ihtiyacım yok. Ayırıcı tam genişliğe gider. İPad'de, boş hücrelerin tam genişlik ayırıcısı var, ancak veri eklendiğinde tam genişliği korumak için kodunuza ihtiyacım var. Aksi takdirde, veriler hücreyi doldurduktan sonra ayırıcı bulunmayan solda birkaç piksel eklenir.
RanLearns

1
Yukarıdaki yorumda kodu nereden
bulduğumu cevaplayın

9

İPad ile ilgili sorunları olan insanlar için - bu sizi iPhone ile aynı duruma getirecektir. Ardından separatorInset, gerektiği gibi ayarlayabilirsiniz .

tableView.cellLayoutMarginsFollowReadableWidth = false

Bu, iOS 10'a karşı iOS 11'deki sorunumdu. İOS 11 iyiydi, ancak 10'un farklı marjları vardı. Teşekkürler!!!
migs647

9

cellForRowAtIndexPathHücrenin ayırıcı özelliklerini yapılandırmak için yöntemde kullanın ,
iOS9.0 + için mükemmel çalışır

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

8

İOS 9.3 ve Swift 2.2 için test edilmiştir. Yalnızca hücreyi oluşturduğunuz yere willDisplayCelldeğil, hücreyi görüntülemeden hemen önce çağrılan kodu koyduğunuzdan emin olun cellForRowAtIndexPath.

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

Bunun overrideiçin işleve ekleyin UITableViewController:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

Yukarıdakilerin hiçbiri Swift 2.2 ve Xcode 7.3.1'de benim için çalışmadı

Herkesin en basit çözümü olduğu ortaya çıktı. Kod gerekmez. Müfettişinizdeki TableViewCellDüzen Kenar Boşlukları değerlerini değiştirmeniz yeterlidir UITableView:


4

Swift 3 için:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

In viewDidLoad(test edilmiş iOS11 - hızlı 4.1)

Deneyin

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

Bu çözümlerin hiçbiri iPad'de çalışmıyor, ancak her iki cihazı da kapsayan bir çözüm buldum:

Yeniden kullanılabilir hücrelerle:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

Yeniden kullanılamayan hücrelerle:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Sadece bu yaklaşımı genişletmek için:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Her iki özellik de UITableView& tarafından kullanılabilir UITableViewCell. İkincisi, aslında, bir özelliği UIView, her ikisi de bir üst sınıf olan UITableViewve UITableViewCell.


1
Tekrar kullanılamayan hücreler için bulduğum tek uygulanabilir çözüm
Mickey

0

swift 5, Xcode 11 Güncellemesi

bunu içerisine yerleştirin viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

kenardan kenara ayırıcı için sadece sol ve sağ değerini 0 olarak ayarlayın.

bu arada "yourTableView" ı tableView Outlet isminizle değiştirin.

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.