IOS 8 UITableView separator əlavə 0 işləmir

UITableView separatorının yerləşdirilməsinin istifadəçi dəyərlərinə təyin olunduğu bir proqram var - Sağ 0 , Sol 0 . Bu iOS 7.x gözəl işləyir, amma iOS 8.0 mən ayırıcının qoyulması sağda default olaraq 15 olaraq təyin olunduğunu görürəm. Xib fayllarında 0 olaraq təyin olunmasına baxmayaraq, hələ də səhv göstərilir.

UITableViewCell ayırma sahələrini necə çıxarmaq olar?

613
10 сент. 10 sentyabr tarixində user3570727 tərəfindən təyin olundu 2014-09-10 19:05 '14 saat 19:05 'da 2014-09-10 19:05
@ 42 cavab
  • 1
  • 2

iOS 8.0, hüceyrələrdə və masa görünüşlərində layoutMargins xüsusiyyətini təqdim edir.

Bu xüsusiyyət iOS 7.0-da mövcud deyil, ona təyin etməzdən əvvəl onu yoxlamaq lazımdır!

Əlavə olaraq, Apple hüceyrəyə bir əmlak əlavə etdi. bu sahənin parametrlərini "Cədvəl" in devralmasına imkan vermir. Bu xüsusiyyət təyin edildikdə, hüceyrələriniz, cədvəldən asılı olmayaraq öz sahələrini özəlləşdirməyə icazə verilir. Bunu əvvəlcədən düşünün.

Bu əmlak preservesSuperviewLayoutMargins adlanır və onu NO olaraq layoutMargin edərkən layoutMargin hüceyrə layoutMargin , layoutMargin -ın sizin TableView-də müəyyən etdiyi hər şeyi ləğv etməyə imkan verəcəkdir. Bu zaman saxlayır ( masa görünüşünün parametrlərini dəyişdirməyin lazım deyil ) və daha qısa. Daha ətraflı məlumat üçün Mike Abdullah ilə əlaqə saxlayın.

Qeyd. Aşağıdakılar, Mike Abdullahın cavabı ilə göstərilən hüceyrə səviyyəsində hüceyrə səviyyəsi parametri üçün təmiz bir tətbiqdir. Saxlanan kameralarınızı konfiqurasiya SuperviewLayoutMargins = NO masa görünüşünüzün hüceyrə parametrlərini ləğv etməməsini təmin edir. Bütün masa görünüşünün ardıcıl sahələrə sahib olmasını istəyirsinizsə, kodunuzu müvafiq olaraq tənzimləyin.

Mobil alanlarınızı seçin:

 -(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 margin settings if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { [cell setPreservesSuperviewLayoutMargins:NO]; } // Explictly set your cell layout margins if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } 

Hüceyrənizdə saxlayanlarSuperviewLayoutMargins mülkiyyətini təyin etmək NO olaraq masa sahələrinizdən masa sahələrini əvvəlcədən önləməməlidir. Bəzi hallarda düzgün işləmir.

Bütün uğursuz olarsa, masa görünüşü sahələrini yenidən təyin edə bilərsiniz:

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

... və sən buradasın! Bu iOS 7 və 8-də işləməlidir.

EDIT: Mohamed Saleh diqqətini iOS 9-da mümkün bir dəyişməyə gətirib çıxardı . Əlavə və ya sahələri qurmaq istəyirsinizsə, cellLayoutMarginsFollowReadableWidth Cədvəl görünüşünü təyin cellLayoutMarginsFollowReadableWidth . Kilometriniz dəyişə bilər, yaxşı sənədləşdirilmir.

Bu xüsusiyyət yalnız iOS 9-da mövcuddur, beləliklə quraşdırma əvvəl yoxlayın.

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

( iOS 8 kodu üzərində UITableView 0 işləməyəcək )

EDIT: bu, təmiz Builder interfeysindən istifadə edir:

2019

16 сент. cdstamper tərəfindən verilmiş cavab 16 sentyabr 2014-09-16 23:19 '14 at 23:19 2014-09-16 23:19

Arg! Cell alt sinifdə oynadığınızdan sonra:

 - (UIEdgeInsets)layoutMargins { return UIEdgeInsetsZero; } 
border=0

cell.layoutMargins = UIEdgeInsetsZero; mənim üçün düzəldib.

248
10 сент. Cavab 10 sentyabr user3570727 tərəfindən verilir 2014-09-10 21:02 '14 at 21:02 2014-09-10 21:02

Onu düzəltməyə çalışmaq üçün onu korlamaqdan əvvəl problemi anlamaq üçün bir an edin.

UITableViewCell ayıklayıcısındaki hızlı bir sıçrayış, sınırlayıcı satırların UITableViewCell alt bölgeleri olduğunu UITableViewCell . Göründüyü kimi, hüceyrənin özü bu xətlərin təşkili üçün böyük məsuliyyət daşıyır.

IOS 8, mockup layout konsepsiyasını təqdim edir. Standart layout sahələri hər tərəfdən 8pt və ata-baba baxışlarından miras alınır.

Ən yaxşı şəkildə deyə bilərik ki, bölüşdürmə xəttini seçərkən, UITableViewCell sol UITableViewCell məhdudlaşdırmaq üçün istifadə edərək sol rejimi izləməyə üstünlük verir.

Bütün bunları birləşdirərək, sıfır sıfır istənilən yerə çatmaq üçün biz aşağıdakılara ehtiyac duymalıyıq:

  • Sol layout layoutunu 0
  • Onu ləğv edən hər hansı miras alınan sahələri dayandırın

Bu, olduqca sadə bir məsələdir:

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

Qeydlər:

  • Bu kod hər bir hüceyrə üçün yalnız bir dəfə işlədilməlidir (hələ də hüceyrənin xüsusiyyətlərini konfiqurasiya edirsiniz) və onu icra etməyə qərar verəndə xüsusi bir şey yoxdur. Sizə təmiz görünən şeyi et.
  • Təəssüf ki, Interface Builder konfiqurasiya üçün heç bir xüsusiyyət mövcud deyil, ancaq arzu edirsinizsə, preservesSuperviewLayoutMargins üçün xüsusi bir iş müddəti atributunu təyin edə bilərsiniz.
  • Şübhəsiz ki, ərizəiniz OS əməliyyat sisteminin əvvəlki versiyasına yönəlibsə, iOS 8 və daha yüksək səviyyədə çalışmadan əvvəl yuxarıda göstərilən kodu yerinə yetirməməlisiniz.
  • QorumalarıSuperviewLayoutMargins qurmaq əvəzinə ata görünüşlərini (məsələn, bir masa) ayrıca 0 marjını tərk etmək üçün fərdiləşdirə bilərsiniz, lakin bu, bütün bu hiyerarşiyi idarə etmədiyinizdən daha çox səhv görünür.
  • Yəqin ki, yalnız sol marjı 0 a təyin etmək və istirahətini tərk etmək bir az təmiz olardı.
  • UITableView adi üslubu ilə masaların altındakı çəkən "əlavə" separatörlərdə "0" əlavə etmək istəyirsinizsə, mən də eyni səviyyələri masa səviyyəsində göstərməlisiniz (cəhd etməməyin!)
173
09 нояб. Cavab Mike Abdullah tərəfindən verildi 09 Noyabr. 2014-11-09 13:49 '14 at 13:49 2014-11-09 13:49

Mən burada soruşduğum eyni sual olduğunu düşünürəm: iOS 8-də SeparatorInset silin Xcode 6 iPhone Simulator üçün UITableView

İOS 8-də, UIView dən miras qalan bütün obyektlər üçün bir yeni əmlak var. Beləliklə, iOS 7.x-də SeparatorInset -i yükləmək qərarı iOS 8-də UITableView-da gördüyünüz yerdən çıxa bilməz.

Yeni mülk " layoutMargins " adlanır.

 @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 

2019

54
11 сент. Ricky tərəfindən verilmiş cavab 11 sentyabr 2014-09-11 15:54 '14 da 15:54 2014-09-11 15:54

UIAppearance tətbiqini tətbiq edərkən (istifadəçi interfeysi yükləməzdən əvvəl), onu qlobal parametrlər kimi təyin etmək üçün istifadə edə bilərsiniz:

 // 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 yolla, UIViewController kodunuzu təmiz tutursunuz və istədiyiniz zaman onu da ləğv edə bilərsiniz.

44
03 февр. Cavab Lukasz verildi 03 fevral. 2015-02-03 13:09 '15 'də saat 13:09 ' da

Tez versiya

iOS, hüceyrələrdə və masa baxımından layoutMargins mülkini təqdim edir.

Bu xüsusiyyət iOS 7.0-da mövcud deyil, ona görə də onu təyin etməzdən əvvəl onu yoxlamaq lazımdır!

Ancaq Apple öz hüceyrəsinə bir əmlak əlavə etdi. saxlayanlarSuperviewLayoutMargins adlandırdılar ki, bu da masa sahəsinin parametrlərini devralmasına imkan verməyəcəkdir. Beləliklə, sizin hüceyrələriniz cədvəlin növündən asılı olmayaraq öz sahələrini özəlləşdirə bilər. Bunu əvvəlcədən düşünün.

Bu əmlak qoruyucularSuperviewLayoutMargins adlanır və onu NO olaraq təyin etmək, öz hüceyrə düzeni parametrlərinizi istifadə edərək, ViewMargin masasının layout parametrlərini qüvvədə saxlamağa imkan verə bilər. Bu zaman saxlayır ( masa görünüşünün parametrlərini dəyişdirməyin lazım deyil ) və daha qısa. Daha ətraflı məlumat üçün Mike Abdullah ilə əlaqə saxlayın.

Qeyd: Bu, Mike Abdullahın cavabında göstərildiyi kimi düzgün, daha az karmaşık bir tətbiqdir; Saxlanan hüceyrələri qəbulu SuperviewLayoutMargins = NO masa görünüşünüzün hüceyrə parametrlərini ləğv etməməsini təmin edir.

İlk addım mobil sahələrinizi təyin etməkdir:

  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 margin settings if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") { cell.preservesSuperviewLayoutMargins = false } // Explictly set your cell layout margins if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins = UIEdgeInsetsZero } } 

Hüceyrənizdə saxlayanlarSuperviewLayoutMargins mülkiyyətini təyin etmək NO olaraq masa sahələrinizdən masa sahələrini əvvəlcədən önləməməlidir. Bəzi hallarda düzgün işləmir.

İkinci addım. Yalnız hər şey uğursuzsa, sahələri "Cədvəl" təyin edə bilərsiniz:

  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 } } 

... və sən buradasın! Bu iOS 8, eləcə də iOS 7-də işləməlidir.

Qeyd: iOS 8.1 və 7.1 istifadə edərək test edilmişdir, mənim vəziyyətimə yalnız bu şərhin ilk addımını istifadə etmək lazımdır.

İkinci addım yalnız seçilmiş hüceyrələrin altında yaşayan bir hüceyrə varsa, yəni tələb olunur. masa masa modelində satır sayından böyük olarsa. İkinci addımın yerinə yetirilməməsi ayırıcının fərqli ofsetinə səbəb olacaq.

38
23 дек. Cavab King-Wizard tərəfindən 23 dekabr. 2014-12-23 21:34 '14 at 21:34 2014-12-23 21:34

Swift-da, bu bir az daha çox cansıxıcıdır, çünki layoutMargins bir mülkiyyətdir, belə ki, layoutMargins və setter yalnış olmalıdır.

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

Bu mənim vəziyyətimdə normal olan layoutMargins oxumaq üçün səmərəli istifadə layoutMargins .

34
11 сент. cavab swilliams verildi Sep 11 2014-09-11 00:35 '14 'də 0:35 2014-09-11 00:35

İOS 9 üçün, əlavə etmək lazımdır:

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

Ətraflı məlumat üçün suallara baxın.

19
30 сент. Cavab Julian Król tərəfindən Sep 30 verildi 2015-09-30 10:41 '15 saat 10:41 'da, 2015-09-30 10:41

Swift 2.0 uzadılması

Mən yalnız masa hüceyrəsi məhdudlaşdırıcılarından sahələri çıxarmaq üçün bir uzantı istifadə etmək istəmişdim.

 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 } } } 

Kontekstdə istifadə olunur:

  let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.removeMargins() return cell 
18
09 сент. Dan Beaulieu Sep 09 verildi 2015-09-09 19:55 '15 at 7:55 pm 2015-09-09 19:55

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 } 
12
22 окт. Aleksandr Volkovun 22 oktyabrda verdiyi cavabı . 2014-10-22 02:35 '14 saat 02:35 'da 2014-10-22 02:35

Bunu bunu edərək etdim:

 tableView.separatorInset = UIEdgeInsetsZero; tableView.layoutMargins = UIEdgeInsetsZero; cell.layoutMargins = UIEdgeInsetsZero; 
10
30 дек. Cavab verilən ideawu 30 dekabr. 2014-12-30 13:19 '15 at 13:19 2014-12-30 13:19

Çox araşdırma etdikdən sonra ...

Bu materialı tamamilə idarə etmək üçün yeganə yol (mən tapa biləcəyim)

Hər bir hüceyrədə ayırıcı əlavələri və düzəltmələri tamamilə idarə et. Bunu, tableview nümayəndəliyindəki willDisplayCell metodunda edin.

 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 obyekti ayırıcıyı nəzarət edir və contentView qalanları idarə edir. Məkan məhdudlaşdırıcı əlavələri gözlənilməz bir rəngdə görünsə, bu onu həll etməlidir:

 cell.backgroundColor = cell.contentView.backgroundColor 
8
05 июля '16 в 17:51 2016-07-05 17:51 Cavab Matjan tərəfindən 05 iyul '17' da 17:51 2016-07-05 17:51 tərəfindən verilir

Cədvəl görünüşünün yerinə cdstamper təklifinə gəldikdə, cellSubview metodunda xətləri aşağıda əlavə etmək mənim üçün işləyir.

 - (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]; } } 
8
26 сент. Cavab verilir Vijay VS 26 sentyabr. 2014-09-26 13:22 '14 da 13:22 2014-09-26 13:22

Mənim üçün sadə bir iş bu işi etdi

 cell.layoutMargins = UIEdgeInsetsZero 
8
18 февр. cavab apinho 18 fevral verildi 2016-02-18 13:30 '16 saat 13:30 'da 2016-02-18 13:30

Swift 3.0 Məsələn:

 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 margin settings if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) { cell.preservesSuperviewLayoutMargins = false } // explicitly setting cell layout margins if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) { cell.layoutMargins = .zero } } 
8
17 авг. Cavab verilir mikle94 17 aug. 2016-08-17 23:32 '16 at 23:32 2016-08-17 23:32

Özel UITableViewCell ilə iOS 8 üçün Swift-də sadə bir həll

 override func awakeFromNib() { super.awakeFromNib() self.layoutMargins = UIEdgeInsetsZero self.separatorInset = UIEdgeInsetsZero } 

Beləliklə, yuxarıda göstərilən cavabların əksəriyyəti təklif willDisplayCell , hər bir willDisplayCell üçün bunu yerinə bir dəfə layoutMarginseparatorInset .

Xüsusi bir UITableViewCell istifadə UITableViewCell , bunun üçün doğru yerdir. Əks halda, bunu tableView:cellForRowAtIndexPath .

Başqa bir ipucu: preservesSuperviewLayoutMargins = false , çünki u mənim dəyər NO !

7
04 июня '15 в 12:24 2015-06-04 12:24 Cavab Francesco Vadicamo tərəfindən 04 İyun '15 'də saat 12:24' də veriləcək

Yalnız bu proqramı həll edə biləcək kodları əlavə edin.

Sizə uğurlar arzulayıram!

 -(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]; } } 
6
15 июля '16 в 6:13 2016-07-15 06:13 Cavab JimmyChang tərəfindən 15 iyul '6' saat 6: 2016-07-15 06:13 'də verilir

IOS 8 və 7-də UITableView üçün istenmeyen dolgu problemlərindən qaçınmaq üçün aşağıdakı kod parçasını istifadə edin.

 -(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
03 нояб. Cavab Anooj VM tərəfindən verilmişdir 03 noyabr. 2014-11-03 15:24 '14 da 15:24 2014-11-03 15:24

Swift mənim üçün işləyən koddur:

 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) } } 

Bütün cell / table edge / field adjustments tableView:willDisplayCell:forRowAtIndexPath: lazımsız kodu tableView:cellForRowAtIndexPath: , tableView:cellForRowAtIndexPath: yerinə tableView:cellForRowAtIndexPath: üçün mənə ən təmiz görünür ( tableView:cellForRowAtIndexPath:

Btw, yalnız hüceyrəni sol seperatora yerləşdirdim, lakin bu halda mənim hüdudda qoyduğum məhdudiyyətləri korlamaq istəmirəm.

Kodu Swift 2.2-ə yeniləndi:

  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) } } 
4
03 нояб. Cavab İyun 03 noyabrda verilir. 2014-11-03 19:26 '14 at 19:26 2014-11-03 19:26

layoutMargins hər birində ( willDisplayCell istifadə edərək) hər dəfə preservesSuperviewLayoutMarginslayoutMargins yenilənməsi yerine, bir dəfə bunu 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 } 
3
01 дек. Rudolf Adamkovič tərəfindən verilmiş cavab 01 Dekabr. 2014-12-01 13:23 '14 at 13:23 2014-12-01 13:23

Burada asanlıqla qlobal yerdən çıxartmaq olar.

UITableViewCell+Extensions.swift :

 import UIKit extension UITableViewCell { override public var layoutMargins: UIEdgeInsets { get { return UIEdgeInsetsZero } set { } } } 

AppDelegate application:didFinishLaunchingWithOptions: ::

  UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero 

A) ayrıca separatorInset uzadılmasını layoutMargins və ya b) əvəzinə layoutMargins üçün görünüş layoutMargins təyin layoutMargins . Heç bir şey olmaz. separatorInset bir əmlak kimi göstərildiyi halda, bir əmlak (və ya metodu) kimi əvəz etməyə çalışarkən kompilyator səhvləri yaradır. Və UITableViewCell layoutMargins (ya da bu məsələ üçün, həmçinin UITableView layoutMarginsseparatorInset üçün görünüşü proxy ünvanlarını təyin etmək üçün) görünüşü proxy qurmaq heç bir təsiri yoxdur.

3
23 окт. 23 oktyabrda Scott Gardner tərəfindən verilmiş cavab 2015-10-23 11:29 '15 at 11:29 2015-10-23 11:29

Cavabların əksəriyyəti hüceyrələr və masa görünüşləri üçün bir çox metod (məsələn, viewDidLayoutSubviews , willDisplayCell , və s.) Tərəfindən təyin olunan ayırma əlavələri və düzəldici sahələri göstərir, amma sadəcə, cellForRowAtIndexPath onları yerləşdirdiyini aşkar etdiyini cellForRowAtIndexPath . Ən təmiz yol kimi görünür.

 // 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]; 
3
29 окт. Cavab inorganik 29 oct verilir . 2014-10-29 19:58 '14 at 19:58 2014-10-29 19:58

İOS8-də:

Bunu UITableViewCell alt sinifə əlavə edərkən:

 - (UIEdgeInsets)layoutMargins { return UIEdgeInsetsZero; } 

və bu "tableView: cellForRowAtIndexPath" və ya "tableView: willDisplayCell" dir:

 [editCell setSeparatorInset:UIEdgeInsetsZero]; 

ME İŞLƏRİMİZ.

3
10 июня '15 в 14:18 2015-06-10 14:18 Cavab CoderSaru tərəfindən 10 iyun 'da 14:18' də verilir 2015-06-10 14:18

Lucas Swift-da cavab verir:

  // 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 } 
3
20 апр. Warthog 20 Aprel cavab verdi. 2015-04-20 23:47 '15 at 23:47 2015-04-20 23:47

Cədvəlləri 3-cü mərtəbədə izləyib sonra, mən TableView və TableViewCell arasında ayrıcının qəbulu arasındakı əlaqənin nə olduğunu öyrənməyə çalışdım və müəyyən bir yoxlama hazırlandım. İşdə mənim nəticələrim var:

  • hüceyrə ayırıcısını sıfıra ayıracaq ayırıcıyı iki addımda hərəkət etməlidir: birinci addım separatorinset hüceyrəsini sıfıra qoymaqdır. ikinci addım marginlayout hücresini sıfıra qurmaqdır .

  • set tableview separatorinsetmarginlayout separatorinset hüceyrəsini təsir edə bilər. Lakin, testdən, TableView separatorinset'in faydasız göründüyünü gördük, TableView marginlayout həqiqətən marginlayout hücresini təsir edə bilər.

  • установить Cell PreservesSuperviewLayoutMargins = false, может отключить эффект TableView marginlayout для ячеек.

  • одно из решений:

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell() cell.preservesSuperviewLayoutMargins = false cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero return cell } 
2
ответ дан Xin Chen 29 авг. '15 в 13:05 2015-08-29 13:05

Это мое решение. Это относится к пользовательскому подклассу ячеек, просто добавьте их в подкласс.

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

2

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

И удобно, что вы можете настроить положение разделителя, не прося ваш дизайнер рисовать один для вас..........

2
ответ дан Guoyu 09 сент. '15 в 10:00 2015-09-09 10:00

В более компактном виде, чем самый проголосовавший ответ...

 - (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
ответ дан subharb 09 июня '15 в 16:55 2015-06-09 16:55

Добавление этого фрагмента, простой элегантный в Swift работает для меня в iOS8:)

  // tableview single line func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.preservesSuperviewLayoutMargins = false cell.layoutMargins = UIEdgeInsetsZero } 
1
ответ дан ddnl 02 сент. '15 в 17:52 2015-09-02 17:52
 -(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; } 

Для любой конкретной ячейки вы хотите скрыть разделитель.

1
ответ дан xmurobi 06 марта '15 в 8:39 2015-03-06 08:39

Это отлично работало для меня в iOS 8 и iOS 9.

Для 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; } 
1
ответ дан jithin 03 окт. '15 в 14:24 2015-10-03 14:24
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос