UITableViewCell arasına boşluk ekleme


182

Aralarına boşluk eklemenin bir yolu var mı UITableViewCell?

Bir tablo oluşturdum ve her hücre sadece bir görüntü içeriyor. Görüntü hücreye şu şekilde atanır:

cell.imageView.image = [myImages objectAtIndex:indexPath.row];

ancak bu görüntüyü büyütüp tüm hücreye sığdırır ve görüntüler arasında boşluk kalmaz.

Ya da bu şekilde görüntünün yüksekliği örneğin 50'dir ve görüntüler arasına 20 boşluk eklemek istiyorum. Bunu başarmanın bir yolu var mı?


1
İçin Swift 2.2 benim cevaba bakınız: stackoverflow.com/a/37673417/2696626
ibrahimyilmaz

Yanıtlar:


160

Hızlı Sürüm

Swift 3 için güncellendi

Bu cevap gelecekteki izleyiciler uğruna orijinal sorudan biraz daha geneldir. Swift için temel UITableView örneğine ek bir örnektir .

resim açıklamasını buraya girin

genel bakış

Temel fikir, her dizi öğesi için yeni bir bölüm (yeni bir satır yerine) oluşturmaktır. Kesitler daha sonra kesit başlığı yüksekliği kullanılarak aralıklandırılabilir.

Nasıl yapılır

  • Projenizi Swift için UITableView örneğinde açıklandığı şekilde ayarlayın . (Yani, a ekleyin UITableViewve tableViewçıkışı Görünüm Denetleyicisine bağlayın).

  • Arayüz Oluşturucu'da, ana görünüm arka plan rengini açık mavi ve UITableViewarka plan rengini temizlemek için değiştirin.

  • ViewController.swift kodunu aşağıdaki ile değiştirin.

ViewController.swift

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // These strings will be the data for the table view cells
    let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"]
    
    let cellReuseIdentifier = "cell"
    let cellSpacingHeight: CGFloat = 5
    
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // These tasks can also be done in IB if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }
    
    // MARK: - Table View delegate methods
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return self.animals.count
    }
    
    // There is just one row in every section
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    // Set the spacing between sections
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return cellSpacingHeight
    }
    
    // Make the background color show through
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = UIView()
        headerView.backgroundColor = UIColor.clear
        return headerView
    }
    
    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!
        
        // note that indexPath.section is used rather than indexPath.row
        cell.textLabel?.text = self.animals[indexPath.section]
        
        // add border and color
        cell.backgroundColor = UIColor.white
        cell.layer.borderColor = UIColor.black.cgColor
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 8
        cell.clipsToBounds = true
        
        return cell
    }
    
    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // note that indexPath.section is used rather than indexPath.row
        print("You tapped cell number \(indexPath.section).")
    }
}

Dizi elemanları ve hafifçe vurma konumları için uygun değerleri elde etmek indexPath.sectionyerine bunun yerine kullanıldığını unutmayın indexPath.row.

Sağdaki ve soldaki ekstra dolgu / alanı nasıl buldunuz?

Herhangi bir görünüme boşluk eklediğiniz gibi aldım. Otomatik düzen kısıtlamaları kullandım. Önde gelen ve sondaki kısıtlamalar için boşluk eklemek için Arayüz Oluşturucu'daki sabitleme aracını kullanmanız yeterlidir.


Merhaba, tüm satırlarınızı bölümlere dönüştürmeden bunun mümkün olup olmadığını merak ediyordum. Her tableViewCell sınırları var, bu yüzden yüksekliği artırmak yardımcı olmaz. Hücremle birçok özelleştirmem var ve bunu bölümlere dönüştürmek istemiyorum. Teşekkürler!
Ujjwal-Nadhani

3
@ user2901306, ilk başta bu yöntemi kullanmakta tereddüt ettim, çünkü sadece satırları kullanabilmem ve bir kenar boşluğunu veya bir şeyi arttırabilmem gerektiğini hissettim. Ancak, bunu yapmanın bir yolunu bulamadım ve bu yöntem oldukça iyi çalıştı. Hücrenizdeki özelleştirmeleri değiştirmek zorunda değilsiniz. Temelde sadece eklemek gerekir numberOfSectionsInTableViewve return 1satır sayısı için. Sonra indexPath.sectiongeçerli hücre dizinini almak için kullanın . Bir kez deneyin. Mevcut kurulumunuzda çok fazla değişiklik yapmanız gerekmediğini düşünüyorum. Bu alt sınıflamadan kesinlikle daha kolaydır.
Suragch

CellForRow'da cell.layer.xxx kullanmak size bir performans isabeti verebilir. Bu değerleri XIB'de daha iyi ayarlayın
Abhishek Bedi

@AbhishekBedi, layermanipülasyonların her zaman oldukça hızlı olduğunu gördüm . Bunu bir performans artışı veya genel olarak iyi bir uygulama olarak fark ettiğiniz için mi söylüyorsunuz? Onları bir XIB'de ayarlasanız bile, hücre oluşturulduğunda hala ayarlanması gerekir.
Şubat'ta Suragch

1
@FateNuller, sana katılmıyorum. Husam'ın cevabı oldukça iyi görünüyor.
Suragch

150

Swift kullanarak kolay çözümüm :

// Inside UITableViewCell subclass

override func layoutSubviews() {
    super.layoutSubviews()

    contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
}

Sonuç resim açıklamasını buraya girin


11
Güzel çözüm. Herhangi bir sorun olması durumunda super.layoutSubviews(), çerçevesini ayarlamadan önce tüm görünümün düzgün bir şekilde yerleştirildiğinden emin olmak için önce aramam gerekiyordu .
ruttopia

@Husam Çözümünüz benim için çalıştı. Ama hücre seçildiğinde bir sorunum var. ContentView için kenarlığı ayarladım ve hücre seçtiğimde kenarlık daha küçük olacak. Nasıl düzeltebilirim?
Bad_Developer

@SonHoang Sen geçersiz gerekebilir didSetiçin selecteddeğişken ve çağrı layoutSubviews()iç!
Husam

1
Hey, Husam. Mükemmel çözüm için teşekkürler. Hücreler arasına eklenen içeriğin rengini nasıl değiştireceğimi söyleme?
A.Kant

1
Bu, kabul edilen cevaptan çok daha iyi bir çözümdür. Kabul edilen cevap yaklaşık 100 kod satırına sahiptir ve bu sadece bir koddur. İnanılmaz.
YungGun

135

Hücreler arasında boşluk eklemeyi sağlamanın yolu numberOfSections = "Dizi sayınız" yapmak ve her bölümün yalnızca bir satır içermesidir. Ve sonra headerView ve yüksekliğini tanımlayın.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return yourArry.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return cellSpacingHeight;
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *v = [UIView new];
    [v setBackgroundColor:[UIColor clearColor]];
    return v;
}

22
Harika çalışıyor. CellForRowAtIndexPath biraz, normal dizi [indexPath.row] ama dizi [indexPath.section] değiştirmek zorunda kaldı. Aksi takdirde dizinin ilk öğesini tüm bölümlerde gösterecektir.
Tom Spee

@TomSpee - cellForRowAtIndexPath'te bu sorunu nasıl çözdünüz?

5
@TKutal - cellForRowAtIndexPath içindeki normal kod gibi ama indexPath.row öğesini indexPath.section olarak değiştirin
Tom Spee

Bu, askerin istediklerini gerçekleştirse de, Apple'ın bu yaklaşımı önereceğine inanmıyorum. Yanılıyorsam beni düzeltin, ancak "bölümler" in tablonuzda temsil ettiğiniz verilerin "bölümlerini" mantıksal olarak ayırmak için olduğunu düşünüyorum. Verilerin her hücresi arasındaki boşlukları stilize etmek için "bölümler" kullanmamalısınız, aksi takdirde tümü tek bir bölümde görüntülenmelidir. Bence daha iyi yaklaşım, daha zor olsa da, UITableViewCell alt sınıf ve hücrenin altına bir görünüm ekleyerek tablo görünümü ayırıcı taklit olacaktır.
FateNuller

2
O zaman Apple şikayet etmemeli, satırlar arasında değişen alan için uygun bir yöntem oluşturmalıdır.
Arnie Schwarzvogel

44

Ben UITableCells aralarında bir "boşluk" sahip aynı kavram yapmak gerekiyordu. Hücreler arasında tam anlamıyla boşluk ekleyemeyeceğiniz için, UITableView'ın hücre yüksekliğini değiştirerek ve ardından hücrenizin contentView öğesine bir UIView ekleyerek sahte yapabilirsiniz. İşte bunu simüle ederken başka bir test projesinde yaptığım bir prototipin ekran görüntüsü:

UITableViewCells arasındaki boşluk

İşte bazı kodlar (Not: gösterim amacıyla çok sayıda sabit kodlanmış değer vardır)

İlk olarak, heightForRowAtIndexPathUITableViewCell farklı yüksekliklere izin verecek şekilde ayarlamak gerekiyordu .

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *text = [self.newsArray  objectAtIndex:[indexPath row]];
    if ([text isEqual:@"December 2012"])
    {
        return 25.0;
    }

    return 80.0;
}

Sonra, ben willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPathyöntem ve bunu yapmak UITableViewCells görünümünü değiştirmek istiyorum .

- (void)tableView:(UITableView *)tableView willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.IsMonth)
    {
        UIImageView *av = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 20, 20)];
        av.backgroundColor = [UIColor clearColor];
        av.opaque = NO;
        av.image = [UIImage imageNamed:@"month-bar-bkgd.png"];
        UILabel *monthTextLabel = [[UILabel alloc] init];
        CGFloat font = 11.0f;
        monthTextLabel.font = [BVFont HelveticaNeue:&font];

        cell.backgroundView = av;
        cell.textLabel.font = [BVFont HelveticaNeue:&font];
        cell.textLabel.textColor = [BVFont WebGrey];
    }


    if (indexPath.row != 0)
    {
        cell.contentView.backgroundColor = [UIColor clearColor];
        UIView *whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,70)];
        whiteRoundedCornerView.backgroundColor = [UIColor whiteColor];
        whiteRoundedCornerView.layer.masksToBounds = NO;
        whiteRoundedCornerView.layer.cornerRadius = 3.0;
        whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1, 1);
        whiteRoundedCornerView.layer.shadowOpacity = 0.5;
        [cell.contentView addSubview:whiteRoundedCornerView];
        [cell.contentView sendSubviewToBack:whiteRoundedCornerView];

    }
}

Benim whiteRoundedCornerView yüksekliği 70.0 yaptığımı ve hücrenin yüksekliği aslında 80.0 olduğundan, ancak contentView 70.0 görünümü veren simüle boşluk neden olduğunu unutmayın.

Bunu daha iyi yapmanın başka yolları da olabilir ama bunu nasıl yapacağımı buldum. Umarım başka birine yardımcı olabilir.


Sadece bir FYI, çok sayıda hücre için, içerik görünümünü willDisplayCell yerine hücre alt sınıfının içinde ayarlamak istersiniz. Performans, kuyruğa daha fazla hücre eklediğinizde bu şekilde büyük bir darbe almaya başlar
BBH1023

@ BBH1023 Hızla görüntülemek için ileri ve geri hareket ederken görünüm her görüntülendiğinde gölge katmanı çoğalır. Zaten bir kez uygulanmışsa bunu iptal etmeyi nasıl önerirsiniz
soulshined

daha fazla gölge eklemek için privent için bunu yapın: NSInteger tag = 120; if (indexPath.row! = 0) {if (cell.tag! = 120) {cell.contentView.backgroundColor = [UIColor clearColor]; ... [cell.contentView sendSubviewToBack: whiteRoundedCornerView]; cell.tag = etiket; }}
user3001228

24

Resminize çerçeve ayarlamanız gerekir. Test edilmemiş kod:

cell.imageView.frame = CGRectOffset(cell.frame, 10, 10);

2
Sadece backgroundView ile test edildi ve bu en basit çalışma çözümü
Sam

2
layoutSubviewsAlt sınıflama yapıyorsanız bu kodu aradığınızdan emin olunUITableViewCell
Mazyod

30
@ NicoHämäläinen Son üç yılda 20'den fazla uygulama geliştirdim ve UITableViewCellihtiyacım olan sonucu almak için DAİMA alt sınıflara ayırdım :) ... Alt sınıflar UITableViewCellçok yaygın.
Mazyod

1
@ NicoHämäläinen alt sınıflamada yanlış bir şey yok UITableViewCell. Özel oluştururken UITableViewCellsalt sınıflandırma yapmanız gerekir UITableViewCell.
Temel Reis

1
@ NicoHämäläinen yorumunuzu o zaman güncellemelisiniz. İnsanlar bilgi edinme eğilimindedir ve daha fazla okumaz. Bu site harika bir kaynak olduğundan ve geliştiriciler burada gördükleri gerçeklere güvenme eğilimi gösterdiğinden, onları korkunç şeyler düşünmeye yönlendirebilirler ... sadece iki madeni param. Belki de histeri var
chrs

11

Aynı teknedeydim. İlk başta bölümlere geçmeyi denedim, ancak benim durumumda düşündüğümden daha fazla bir baş ağrısı oldu, bu yüzden bir alternatif arıyorum. To satırları kullanmaya devam , sadece buradaki tarafından benim için çalıştı ne (eğer modeli verilere erişmek nasıl ve karışıklık) bir maske kullanılarak :

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let verticalPadding: CGFloat = 8

    let maskLayer = CALayer()
    maskLayer.cornerRadius = 10    //if you want round edges
    maskLayer.backgroundColor = UIColor.black.cgColor
    maskLayer.frame = CGRect(x: cell.bounds.origin.x, y: cell.bounds.origin.y, width: cell.bounds.width, height: cell.bounds.height).insetBy(dx: 0, dy: verticalPadding/2)
    cell.layer.mask = maskLayer
}

Tek yapmanız gereken , hücrenin yüksekliğini istediğiniz değerle daha büyük yapmakverticalPadding ve daha sonra iç mizanpajınızı, hücrenin kenarlarına boşluk bırakan görünümlerin aynı boşluğun artmasını sağlayacak şekilde değiştirmek verticalPadding/2. Minör olumsuz? Elde verticalPadding/2üst ve tableView altındaki hem dolgu, ancak hızlı bir şekilde ayarlayarak bunu düzeltebilir tableView.contentInset.bottom = -verticalPadding/2ve tableView.contentInset.top = -verticalPadding/2. Umarım bu birine yardımcı olur!


1
Swift 5'de de çalışır.
LondonGuy

1
En iyi cevap!! Teşekkür ederim. Özel bir hücre kullanılıyorsa, bu "geçersiz kılma fonkunu awakeFromNib ()" ile çalışır
trees_are_great

10

Ben sadece biraz yer ve muhtemelen en az pahalı arıyorsanız en basit ileri çözüm sadece hücre sınır rengini tablolar arka plan rengine ayarlamak sonra istediğiniz sonucu elde etmek için sınır genişliğini ayarlamak olacağını düşünüyorum!

    cell.layer.borderColor = blueColor.CGColor
    cell.layer.borderWidth = 3

1
Saydam arka plan için iyi bir fikir değil. Aksi takdirde işe yarayabilir.
ergunkocak

1
Bu doğru. Tüm durumlar için bir çözüm değil ama bazıları için işe yarayacak! @ergunkocak
Craig

8

Bölüm üstbilgilerini (veya altbilgilerini) zaten kullanmıyorsanız, bunları tablo hücrelerine rastgele boşluk eklemek için kullanabilirsiniz. N satırlı bir bölüm yerine, her birinde bir satır bulunan n bölümlü bir tablo oluşturun.

Boşluğu tableView:heightForHeaderInSection:kontrol etmek için yöntemi uygulayın.

tableView:viewForHeaderInSection:Boşluğun neye benzediğini kontrol etmek için de uygulamak isteyebilirsiniz .


8

Swift 4'te bu şekilde çözdüm.

UITableViewCell bir uzantısı oluşturmak ve bu kodu dahil:

override open var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        var frame =  newFrame
        frame.origin.y += 10
        frame.origin.x += 10
        frame.size.height -= 15
        frame.size.width -= 2 * 10
        super.frame = frame
    }
}

override open func awakeFromNib() {
    super.awakeFromNib()
    layer.cornerRadius = 15
    layer.masksToBounds = false
}

Umarım size yardımcı olur.


hücredeki metin kırpılır.
Mehdico

CGRect geçersiz kılma çalışıyor ve awakeFromNib olanı eklemedim.
Eric Tan

5

Hızlı 3'te örnek ..

resim açıklamasını buraya girin

  1. Tek görünüm uygulaması oluşturma
  2. görünüm denetleyicisine tableview ekle
  3. tablview hücresi için özel hücre ekleme
  4. kontrolör kodunu görüntüle

       class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
       @IBOutlet weak var tableView: UITableView!
    
    
        var arraytable = [[String:Any]]()
         override func viewDidLoad() {
         super.viewDidLoad()
    
         arraytable = [
         ["title":"About Us","detail":"RA-InfoTech Ltd -A Joint Venture IT Company formed by Bank Asia Ltd"],
         ["title":"Contact","detail":"Bengal Center (4th & 6th Floor), 28, Topkhana Road, Dhaka - 1000, Bangladesh"]
    ]
    
    
    
    
    
    
       tableView.delegate = self
       tableView.dataSource = self
    
       //For Auto Resize Table View Cell;
      tableView.estimatedRowHeight = 44
       tableView.rowHeight = UITableViewAutomaticDimension
    
       //Detault Background clear
       tableView.backgroundColor = UIColor.clear
    }

    işlev numberOfSections (tableView: UITableView içinde) -> Int {return arraytable.count}

       func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return 1
     }
    
    // Set the spacing between sections
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 10
    }
    
    // Make the background color show through
      func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView()
    headerView.backgroundColor = UIColor.clear
    
    return headerView
    }
    
         func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
         let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as! CustomCell
    
         cell.tv_title.text = arraytable[indexPath.section]["title"] as! String?
        cell.tv_details.text = arraytable[indexPath.section]["detail"] as! String?
    
       //label height dynamically increase
       cell.tv_details.numberOfLines = 0
    
    
    
    
       //For bottom border to tv_title;
       let frame =  cell.tv_title.frame
        let bottomLayer = CALayer()
       bottomLayer.frame = CGRect(x: 0, y: frame.height - 1, width: frame.width, height: 1)
        bottomLayer.backgroundColor = UIColor.black.cgColor
       cell.tv_title.layer.addSublayer(bottomLayer)
    
      //borderColor,borderWidth, cornerRadius
      cell.backgroundColor = UIColor.lightGray
      cell.layer.borderColor = UIColor.red.cgColor
      cell.layer.borderWidth = 1
      cell.layer.cornerRadius = 8
      cell.clipsToBounds = true
    
      return cell
      }
    
       }
  5. Github için tam kaynağı indir: link

    https://github.com/enamul95/CustomSectionTable


@Suragch'ın daha önce hızlı sürüm için yanıtlandığı başka bir cevabı çoğalttı, lütfen çoğaltma yapmaktan kaçının
Amr Angry

1
bu iyi bir çözüm değil. Bir başlık içeren başlık bölümüne ihtiyacınız varsa bu işe yaramaz
kuzdu

4

Düşünebileceğim üç yaklaşım:

  1. Tüm hücrenin görünümünü istediğiniz şekilde düzenleyen özel bir tablo hücresi oluşturun

  2. Görüntüyü görüntü görünümüne eklemek yerine, görüntü görünümünün alt görünümlerini temizleyin, görüntü için bir UIImageView ve başka bir görünüm, belki de istenen aralığı sağlayan basit bir UIView ekleyen özel bir görünüm oluşturun ve görüntünün alt görünümü olarak ekleyin görüntü görünümü.

  3. UIImageView doğrudan sabit bir boyut / dolgu ayarlamak için manipüle önermek istiyorum, ama ben bu yüzden / nasıl çalışıp çalışacağını doğrulayamıyorum Xcode yakın bir yerde değilim.

bu mantıklı mı?


4

Evet, hücredeki içerik görünümünde bir temel görünüm oluşturarak iki hücre arasındaki boşluğu (dolgu) artırabilir veya azaltabilirsiniz.İçerik görünümü arka planı için net renk ayarlayın ve hücreler arasında boşluk oluşturmak için temel görünümün yüksekliğini ayarlayabilirsiniz.


4

Husam'ın cevabına dayanarak: İçerik görünümü yerine hücre katmanının kullanılması, tüm hücrenin ve gerekirse aksesuarın etrafına kenarlık eklenmesine olanak tanır. Bu yöntem, hücrenin alt sınırlarının ve bu eklerin dikkatlice ayarlanmasını gerektirir, aksi takdirde görünüm uygun olmaz.

@implementation TableViewCell

- (void)awakeFromNib { 
    ... 
}

- (void) layoutSubviews {
    [super layoutSubviews];

    CGRect newFrame = UIEdgeInsetsInsetRect(self.layer.frame, UIEdgeInsetsMake(4, 0, 4, 0));
    self.layer.frame = newFrame;
}

@end

3

Bölümdeki satır sayısını 1 olarak değiştirin Satır sayısı yerine bölüm sayısını değiştirdiniz

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        1
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

Burada satırlar arasına boşluk koyuyorsunuz

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }

2

Bence bu en temiz çözüm:

class MyTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        layoutMargins = UIEdgeInsetsMake(8, 0, 8, 0)
    }
}

1
layoutMarginsBu şekilde uyguladıktan sonra görsel bir değişiklik göremedim . Belki de autolayout kullandığım için.
Cur

Kenar boşlukları hücre için açık bir yüksekliği "kırmaz", bu nedenle bunun çalışması için hücrelerin otomatik yüksekliğine sahip olmanız gerekir
Aviel Gross

1
Otomatik yüksekliğim var.
Coeur

2

Bu makale yardımcı oldu, hemen hemen diğer cevaplar söylediler ama özetle ve özlü

https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6

İçinde, onları sadece sol ve sağ taraflara uygular, ancak UIEdgeInsetsMakeinit dört noktaya da dolgu eklemeye izin verir.

func UIEdgeInsetsMake (_ üst: CGFloat, _ sol: CGFloat, _ alt: CGFloat, _ sağ: CGFloat) -> UIEdgeInsets

Açıklama
Bir düğme veya görünüm için bir kenar iç metin oluşturur. İç metin, bir dikdörtgenin etrafındaki kenar boşluğudur. Pozitif değerler, dikdörtgenin ortasına yakın kenar boşluklarını, negatif değerler ise merkezden daha uzak kenar boşluklarını temsil eder.

Parametreler
üst: Bir nesnenin üst kısmındaki iç metin.
left: Bir nesnenin
alt kısmındaki iç metin: Bir nesnenin altındaki iç metin.
right: Bir nesnenin sağındaki iç metin.


Bir düğme veya görünüm için bir iç metin döndürür

UIEdgeInsets'in de bunu başarmak için kullanılabileceğini unutmayın.

Xcode 9.3 / Hızlı 4


Bu yanıt kodun Swift 4 uyumlu olduğunu yanlış söylüyor ancak UIEdgeInsetsMake kullanımdan kaldırıldı. Bunun yerine UIEdgeInsets kullanılmalıdır.
José

developer.apple.com/documentation/uikit/… tam olarak nerede kaldırıldığını söylüyor? Bunu projelerimde kullanıyorum ve en yeni Xcode ile çalışıyorum, bu nedenle Swift 9.3 @ José
Mauricio Chirino

Haklısın, özür dilerim, benim hatam. UIEdgeInsets tercih edilir, ancak bu diğerinin kullanımdan kaldırıldığı anlamına gelmez. SwiftLint, UIEdgeInsetsMake'i kullanırken eski yapıcı hakkında olsa şikayet edecek.
José

1
Tamam anladım. Lütfen döktüğünüz kişi olsanız lütfen aşağı oyu kaldırın, cevabımın tek olası olduğunu asla söylemedim.
Mauricio Chirino

Cevabınızı değiştirmedikçe oyumu değiştiremeyeceğim yazıyor. İfadeyi biraz değiştirebilir misiniz?
José

2

Bir grup farklı bölüm kullanmak gerekmez. Diğer cevaplar çerçeve iç metinleri ve CGRect ve katmanları ve ... BLAH kullanır. İyi değil; otomatik düzen ve özel bir UITableViewCell kullanın. Bu UITableViewCell'de, içeriğinizi contentView içindeki alt görüntüleme yerine yeni bir containerView (UIView) yapın, containerView öğesini contentView içindeki alt görünümüne, ardından tüm konteyner görünümünüzdeki görünümlerine bakın.

Boşluğu şimdi yapmak için, kapsayıcı görünümünün düzen kenar boşluklarını aşağıdaki gibi düzenleyin:

class CustomTableViewCell: UITableViewCell {
    let containerView = UIView()
    let imageView = UIImageView()

    required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)}

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        containerView.translatesAutoResizingMaskIntoConstraints = false
        imageView.translatesAutoResizingMaskIntoConstraints = false
        contentView.addSubview(containerView)
        containerView.addSubview(imageView)

        contentView.layoutMargins = UIEdgeInsets(top: 15, left: 3, bottom: 15, right: 3)
        containerView.layoutMargins = UIEdgeInsets(top: 15, left: 17, bottom: 15, right: 17) // It isn't really necessary unless you've got an extremely complex table view cell. Otherwise, you could just write e.g. containerView.topAnchor

        let cg = contentView.layoutMarginsGuide
        let lg = containerView.layoutMarginsGuide
        NSLayoutConstraint.activate([
            containerView.topAnchor.constraint(equalTo: cg.topAnchor),
            containerView.leadingAnchor.constraint(equalTo: cg.leadingAnchor),
            containerView.trailingAnchor.constraint(equalTo: cg.trailingAnchor),
            containerView.bottomAnchor.constraint(equalTo: cg.bottomAnchor),
            imageView.topAnchor.constraint(equalTo: lg.topAnchor),
            imageView.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
            imageView.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
            imageView.bottomAnchor.constraint(equalTo: lg.bottomAnchor)
        ])
    }
}


1

Benim durumum ben özel UIView viewForHeader bölümünde ayrıca heightForHeader bölüm dönüş sabit yükseklik 40 demek için kullanılan, hiçbir veri olmadığında tüm başlık görünümleri birbirine dokundu zaman oldu. bu yüzden sadece "Grup" için "tableview tarzı" uçak değiştirerek sabit böylece veri yok bölüm arasında boşluk istedim. ve bu benim için çalıştı.


1

Objective-C'nin çalışma zamanı özelliklerini alt sınıflandırma ve kullanma ile GitHub'daki çözümüme göz atın UITableView.
Temelde Apple'ın özel veri yapısını kullanarak UITableViewRowData, özel çalışma zamanı başlığını aradım UITableView:

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableView.h ,

burada, hücrelerinizin boşluklarını, hücre sınıflarına yerleştirmeden istediğiniz gibi düzenlemek için ihtiyacınız olan her şeyi içeren istediğiniz özel sınıf:

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h


1

Hücrede arka plan renkleri ve aksesuar görünümleriyle birlikte çalışmakta sorun yaşıyordum. Aşağıdakileri yapmak zorunda kaldı:

1) Arka plan rengiyle bir UIView kümesi ile hücrelerin arka plan görünümü özelliğini ayarlayın.

let view = UIView()
view.backgroundColor = UIColor.white
self.backgroundView = view

2) Boşluk fikrini eklemek için bu görünümü mizanpajda yeniden konumlandırın

override func layoutSubviews() {
    super.layoutSubviews()
    backgroundView?.frame = backgroundView?.frame.inset(by: UIEdgeInsets(top: 2, left: 0, bottom: 0, right: 0)) ?? CGRect.zero
}

1

Üstbilgileri boşluk olarak kullanmak, herhangi bir üstbilgi kullanmak istemiyorsanız sanırım. Aksi takdirde, muhtemelen en iyi fikir değildir. Bence özel bir hücre görünümü oluşturmak.

Örnekler:

Özel hücrede, tüm hücreyi doldurmaması, bazı dolgu vermesi için kısıtlamaları olan bir arka plan görünümü yapın.

Ardından, tablo görünümü arka planını görünmez yapın ve ayırıcıları kaldırın:

// Make the background invisible
tableView.backgroundView = UIView()
tableView.backgroundColor = .clear

// Remove the separators
tableview.separatorStyle = .none

1

Tablo görünümünüzün (benim yaptığım gibi) bölüm ve satır numarasını değiştirmek istemiyorsanız, şunları yapabilirsiniz:

1) Tablo hücre görünümünüzün altına bir ImageView ekleyin.

2) Tablo görünümünün arka plan rengiyle aynı rengi yapın.

Bunu uygulamamda yaptım ve mükemmel çalışıyor. Şerefe! : D


0

resim açıklamasını buraya girinSWift-5, UITableViewCell Arasındaki Aralık

    1. use sections instead of rows
    2. each section should return one row
    3. assign your cell data like this e.g [indexPath.section], instead of row
    4. use UITableView Method "heightForHeader" and return your desired spacing
    5. Do rest things as you were doing it

    Thanks!

0

Kısıtlamayı aşağıdaki gibi kodda kullanabilirsiniz:

class viewCell : UITableViewCell 
{

@IBOutlet weak var container: UIView!



func setShape() {
    self.container.backgroundColor = .blue
    self.container.layer.cornerRadius = 20
    container.translatesAutoresizingMaskIntoConstraints = false
    self.container.widthAnchor.constraint(equalTo:contentView.widthAnchor , constant: -40).isActive = true
           self.container.heightAnchor.constraint(equalTo: contentView.heightAnchor,constant: -20).isActive = true
           self.container.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
           self.container.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true

    }
}

alt görünüm (kapsayıcı) eklemek ve diğer öğeleri içine koymak önemlidir.


-2

hücreye bir iç görünüm ekleyin ve ardından ona kendi görünümlerinizi ekleyin.


-2

Swift 5.0 çözümü

UITableViewCell alt sınıfı içinde

override func layoutSubviews() {
    super.layoutSubviews()
    let padding = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
    bounds = UIEdgeInsetsInsetRect(bounds, padding)
}

-4

UITableViewDelegate kullanın heightForRowAtIndexPathve satır yüksekliğini döndürün.

 (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 return 100.0f ;
}

Soru hücre yüksekliği yerine hücreler arasında boşluk eklemek nasıl
shippo7
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.