Soru İOS 7'deki UITableView hücrelerini ayırıcıda satır sonu olmaması için bir yol var mı?


İOS 7’de UITableViewCells’in iOS 6’nın sahip olmadığı hücrenin ayırıcısında satır sonu olduğunu fark ettim. Bu hat kesintisinden kurtulmanın bir yolu var mı? Ayırıcıyı hiçbiri olarak değiştirmemek ve daha sonra UIView'leri ayırıcının rengiyle yapmak hala beyaz ayırıcının neden olmamasını sağlar.


68
2017-08-21 18:29


Menşei




Cevaplar:


İOS7 için:

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

İOS8 için:

Önce tablo görünümünü aşağıdaki gibi yapılandırın:

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

Sonra senin içinde cellForRowAtIndexPath: yöntemi, hücreyi aşağıdaki gibi yapılandırın:

if ([cell respondsToSelector:@selector(layoutMargins)]) {
    cell.layoutMargins = UIEdgeInsetsZero;
}

Not: Her ikisini de ekleyin layoutMargins ve separatorInset, hem iOS sürümlerini desteklemek için


116
2017-09-11 18:59



Bu, iOS 7'de çalıştı, ancak iOS 8'de çalışmıyor. - William Jockusch
size cevap güncelleme için ty - Jenson
İOS8'de önerilen iOS8 çözümü benim için çalışmıyor. - Chris Prince
Güncelle: Ayarladığınızda iOS 8 düzeltmesi çalışır layoutMargins içinde viewDidLayoutSubviews. Bunu ayarlarsanız işe yaramıyor viewDidLoad veya benzeri. Cevabını düzenledim, böylece bu açık. - Chris Nolet
ViewDidLoad üzerinde benim için iyi çalışıyor ... - Luis E. Prado


''Ayırıcı iç'storyboard'dan:

enter image description here

enter image description here


44
2017-09-21 17:31



UIView veya UIViewController ebeveyni içinde UITableView'a sahip olanlar için yukarıdaki görüntüyü göremezsiniz, ancak UITableView öğesinin .xib'inizde olup olmadığını denetlerseniz "Ayırıcı Analizleri" "Varsayılan" olarak ayarlandığını görürsünüz. "Özel" i seçin ve sola veya sağa doğru 0 değiştirin. Başka bir deyişle, tüm diğer şeyleri denemek için zaman kaybetmeyin! İnterneti IB ile ayarlayın. - whyoz
Bu doğru geliyor ama benim için çalışmadı. Yeni bir proje oluşturdum, bir TVC'ye sürükledim, kök VC yaptım ve sol eki 0 olarak değiştirdim. Simülatörü çalıştırdım ve ayırıcılar hala içerideydi. Bir fikrin neden? nobre'nin çözümü (aşağıda) benim için çalışıyor. - mkc842
Teşekkürler! Beni çok zaman kurtardın. - Ryan Walton


İOS'un eski sürümlerini desteklemek istiyorsanız, aramadan önce bu yöntemin kullanılabilirliğini kontrol etmelisiniz:

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

37
2017-09-27 23:08



İos6'yı da hedeflemiyorsanız, bu daha güvenlidir. - Yunus Nedim Mehel
Bunu iOS6'da nasıl alabilirim? - thatzprem


Anladım.

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

16
2017-08-21 18:34



Bu benim için de çalıştı. Bu arada, neden bu ayraçların aradan ayrıldığını anlamıyorum. Ve benim app içinde bir tablo görünümünde aynı ayırıcı çizgi çift ve diğerleri tek. Neden - hiçbir fikrim yok. - Valeriy Van
boş tablo görünümü için benim için işe yaramadı. ama yeniden kullanılabilecek özel hücre ayırıcılarım deafault olarak kaldı - Karan Alangat


Seçilen cevap benim için çalışmadı. Ama bu evet ve ios 2.0'dan çalışıyor:

   [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

9
2017-10-08 13:30



Sadece eğer istersen iyi yok hayır ayırıcı hiç. - Chris Prince
Hayır, hiç stil istemiyorsan ve istediği bu. - anasaitali
Bu soruya cevap vermiyor. - King-Wizard


Hızlı sürümü

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

Bu özellik iOS 7.0'da mevcut değildir, bu yüzden atamadan önce kontrol ettiğinizden emin olmalısınız!

Ancak Apple, hücrenize Tablo Görünümü'nün kenar boşluğu ayarlarını devralmasını engelleyecek bir ** özellik ekledi. Bu şekilde, hücrelerin kendi kenar boşluklarını tablo görünümünden bağımsız olarak yapılandırabilir. Bunu bir geçersiz kılma olarak düşün.

Bu özellik denir preservesSuperviewLayoutMarginsve HAYIR olarak ayarlamak, Tablo Görünümü'nün layoutMargin ayarlarını kendi hücrenizin layoutMargin ayarınız ile geçersiz kılmanıza izin verebilir. Her ikisi de zaman kazandırır (Tablo Görünümünün ayarlarını değiştirmek zorunda değilsiniz) ve daha özlü. Detaylı bir açıklama için lütfen Mike Abdullah'ın yanıtına bakınız.

NOT: Bu, Mike Abdullah'ın cevabında ifade edildiği gibi, daha az dağınık bir uygulama; hücrenin koruyucusunu ayarlamaSuperviewLayoutMargins = NO, Tablo Görünümü'nizin hücre ayarlarını geçersiz kılmadığından emin olur.

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

/*
    Tells the delegate 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 seperator 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 koruyucularSuperviewLayoutMargins özelliğini HAYIR olarak ayarlayın meli Tablo görünümünüzün hücre kenar boşluklarınızı geçersiz kılmasını engelleyin. Bazı durumlarda, düzgün çalışmıyor gibi görünüyor.

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

/*
    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 gidiyorsun! Bu iOS 8 ve iOS 7'de çalışmalıdır.

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

İkinci Adım sadece, işlenen hücrelerin altında doldurulmamış hücreniz varsa gereklidir, örn. Tablo, tablo modelindeki satır sayısından daha büyükse. İkinci adımı yapmamak farklı ayırıcı ofsetlerle sonuçlanır.


9
2017-12-23 18:52



Mükemmel, teşekkür ederim - Asinox


Uygulama çapında kalıcı bir çözüm için, bunu uygulamada arayın: didFinishLaunching .. herhangi bir tablo görünümü "sabit" olacak

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
  [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
}

8
2017-11-07 17:33





Ve iOS 8'de, Seth McFarlane postasına dayanarak İşte, layoutMargins ile başlamaya başlamanız gerekir. Aşağıdaki benim için yaptı:

  1. ApplicationDidFinishLaunching'de aşağıdakileri çalıştırın:

    if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
        [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
    }
    
  2. UITableView üzerinde aşağıdaki kategoriyi oluşturun:

    @interface UITableView(WJAdditions)
    -(void) wjZeroSeparatorInset;
    @end
    
    @implementation UITableView (WJAdditions)
    -(void) wjZeroSeparatorInset {
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
      if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
        self.layoutMargins = UIEdgeInsetsZero;
      }
    #endif
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
       if ([self respondsToSelector: @selector(setSeparatorInset:)])
          self.separatorInset = UIEdgeInsetsZero;
       }
    #endif
    }
    @end
    
  3. UITableView'larınızda, başlatıldıktan kısa bir süre sonra, çağrı yapın

    [self wjZeroSeparatorInset];
    
  4. UITableViewControllers'ınızda, aşağıdakilere ihtiyacınız var:

    -(void) viewWillLayoutSubviews {
      [super viewWillLayoutSubviews];
      UITableView* tv = self.tableView;
      if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
        [tv setLayoutMargins:UIEdgeInsetsZero];
      }
    }
    

7
2017-09-10 02:10



Kategoriyi kullanmak için +1. - Foriger


İOS 8'de küçük bir hata var gibi görünüyor. Ayırıcı eki için özel değer, içindeki metne sahip hücrelere uygulanmaz. Bunu arayüz oluşturucusundan ve koddan ayarlamayı denedim ama ne işe yaramadı. Ben de bir hata raporu verdim.

enter image description here

Bu arada, bunu başarmak için küçük bir çözümüm var. Ben sadece hücre üzerindeki çizgiyi çiziyorum. Bir alt sınıf oluşturmak UITableViewCell ve geçersiz kıl drawRect yöntem. Ayrıca ayırıcının özelliğini de ayarlamayı unutmayın. UITableView Hiçbirine. İşte kod. Swift'de ama temel olarak C olduğu için aynı şeyi Objective-C'de de kullanabilirsiniz.

override func drawRect(rect: CGRect) {
    super.drawRect(rect)

    let context = UIGraphicsGetCurrentContext()
    CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color
    CGContextSetLineWidth(context, 2) // separator width

    CGContextMoveToPoint(context, 0, self.bounds.size.height)
    CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height)
    CGContextStrokePath(context)
}

6
2017-08-01 21:01



Teşekkür ederim. CGContextSetLineWidth(context, 1) herhangi biri daha "vanilya" görünümü isterse, varsayılan değere yakındır - Michael


Reset separatorInset bu sorunu benim için giderir:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:self.tableView.separatorInset];
}

4
2017-10-11 12:03



İos6'yı da hedeflemiyorsanız, bu daha güvenlidir. - Yunus Nedim Mehel


Çö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];
   }
}

3
2017-10-24 04:30