Gruplanmış stilde bir UITableView'da bir hücrenin genişliği nasıl ayarlanır


107

Yaklaşık 2 gündür bunun üzerinde çalışıyorum, bu yüzden öğrendiklerimi sizinle paylaştığımı düşündüm.

Soru şudur: Gruplanmış bir UITableView'daki bir hücrenin genişliğini küçültmek mümkün müdür?

Cevap hayır.

Ancak bu sorunu aşmanın iki yolu var.

Çözüm 1: Daha ince bir tablo TableView çerçevesini değiştirmek mümkündür, böylece tablo daha küçük olacaktır. Bu, UITableView'ün hücreyi azaltılmış genişlik ile oluşturmasına neden olur.

Bunun için bir çözüm şuna benzeyebilir:

-(void)viewWillAppear:(BOOL)animated
{
    CGFloat tableBorderLeft = 20;
    CGFloat tableBorderRight = 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
    tableView.frame = tableRect;
}

2.Çözüm: Hücrelerin görüntülerle işlenmesi

Bu çözüm burada açıklanmıştır: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

Umarım bu bilgi sana faydalı olur. Pek çok olasılığı denemek yaklaşık 2 günümü aldı. Geriye kalan bu.


3
Sanırım bu sadece ikinci satırla ("Soru: ..."), ardından Çözüm 1 ve Çözüm 2 olmak üzere iki ayrı cevap olarak gönderilmiş, biri kabul edilerek bir soru olarak düzenlenmeli. Ardından, diğer kullanıcılar kendi cevaplarını eklerse ve bunlardan biri daha iyi hale gelirse, kabul edilen cevap daha sonra değiştirilebilir.
GeneralMike

Yanıtlar:


226

Bunu başarmanın daha iyi ve daha temiz bir yolu, UITableViewCell'i alt sınıflara ayırmak ve -setFrame:yöntemini şu şekilde geçersiz kılmaktır :

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

Neden daha iyi? Çünkü diğer ikisi daha kötü.

  1. Tablo görünümü genişliğini şurada ayarla: -viewWillAppear:

    Her şeyden önce, bu güvenilmezdir, süpervizör veya üst görünüm kontrolörü -viewWillAppear:, çağrıldıktan sonra tablo görünümü çerçevesini daha da ayarlayabilir . Tabii ki, -setFrame:burada UITableViewCells için yaptığım gibi UITableView'ınız için alt sınıflara girebilir ve geçersiz kılabilirsiniz . Bununla birlikte, UITableViewCells'in alt sınıflara ayrılması çok yaygın, hafif ve Apple yöntemidir.

    İkinci olarak, UITableView'unuzda backgroundView varsa, arka plan Görünümünün birlikte daraltılmasını istemezsiniz. UITableView genişliğini daraltırken backgroundView genişliğini korumak önemsiz bir iş değildir, alt görünümleri denetlemenin ötesine genişletmenin ilk etapta yapılacak çok zarif bir şey olmadığını belirtmiyorum bile.

  2. Daha dar bir genişliği taklit etmek için özel hücre oluşturma

    Bunu yapmak için, yatay kenar boşluklarına sahip özel arka plan resimleri hazırlamanız ve kenar boşluklarına uyum sağlamak için hücrelerin alt görünümlerini kendiniz düzenlemeniz gerekir. Buna karşılık, yalnızca tüm hücrenin genişliğini ayarlarsanız, otomatik yeniden boyutlandırma sizin için tüm işleri yapacaktır.


2
bu güzel ve zarif bir çözüm, bir kategoride yaptım :) Ayrıca daha şeffaf nesneler, daha fazla cpu yükü olduğunu da not edeceğim :)
mister koz

11
@misterkoz - bir uyarı: Bazı iOS kontrolleri (kesin olarak UIDatePicker) dahili olarak UITableViewCells kullanır ve bunu bir kategoriye uygularsanız bozulur.
Clafou

7
Düzenleme modunda bir hücreyi kaldırmaya çalışırken bu yöntem iOS8'de çalışmıyor gibi görünüyor. Düzenleme moduna girdiğinizde / çıktığınızda setFrame çağrılır, böylece hücre küçülmeye devam eder. Buna herhangi bir çözüm var mı?
John Baum

3
@JohnBaum bu yardımcı olabilir (en azından benim durumumda işe yarıyor): stackoverflow.com/questions/25911484/ios-8-cell-resizing/…
HashtagMarkus

2
Bu çözüm gerçekten nimettir. Birinin aynı şeyi hızlı bir şekilde nasıl yapacağını merak etmesi durumunda - reddit.com/r/swift/comments/2fr849/…
sysuser

16

Bunu, değişkenleri ayarlamak için yöntemler sağlamayan Swift'de yapmak için, ayarlayıcıyı geçersiz kılmanız gerekir frame. Başlangıçta (Nerede bulduğumu en azından) yayınlanmıştır burada

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        let inset: CGFloat = 15
        var frame = newFrame
        frame.origin.x += inset
        frame.size.width -= 2 * inset
        super.frame = frame
    }
}

Swift için çalışıyor
Simon McNeil

9

Hiçbir şey işe yaramazsa bunu deneyebilirsin

Hücrenin arka plan rengini net renk yapın ve ardından hücre görüntüsünü gerekli boyutta yerleştirin. Bu hücrede bir metin görüntülemek istiyorsanız, görüntünün üzerine bir etiket koyun. Etiketin arka plan rengini de net bir renge ayarlamayı unutmayın.


8

Kabul edilen çözümün rotasyon üzerine işe yaramadığını buldum. Sabit genişliklere ve esnek marjlara sahip UITableViewCells'e ulaşmak için yukarıdaki çözümü aşağıdakilere uyarladım:

- (void)setFrame:(CGRect)frame {

    if (self.superview) {
        float cellWidth = 500.0;
        frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
        frame.size.width = cellWidth;
    }

    [super setFrame:frame];
}

Yöntem, cihaz her döndüğünde çağrılır, böylece hücreler her zaman ortalanmış olur.


0

Ekran döndürüldüğünde çağrılan bir yöntem var: viewWillTransitionToSize

Çerçeveyi yeniden boyutlandırmanız gereken yer burasıdır. Örneğe bakın. Çerçeve koordinatlarını gerektiği gibi değiştirin.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        int x = 0;
        int y = 0;
        self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
    }];
}

-2

içinde yaparım

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
    CGFloat tableBorderRight = self.view.frame.size.width - 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect;
}

Ve bu benim için çalıştı


-6

.H dosyasında 'UITableViewDataSource' temsilcisini ekleyin

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    return size;
}

4
Yüksekliği değil genişliği ayarlamak istiyor
Christopher Pickslay

oh hoo. rahatsızlıktan dolayı özür dilerim.
bharath gangupalli

soruyu yanlış anlıyorsun ve boy için cevap veriyorsun ve benim için ne işe yaradığını biliyorsun çünkü genişlik için değil yüksekliği arıyorum.. cevap için teşekkürler
Pooja
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.