2011-10-20 19 views
11

Bunun AutoResizingMasks etrafında dönen basit bir yanıt olacağına inanıyorum, ancak başımı bu konu etrafında sarmalayamıyorum.Otomatik Boyutlandırma UITableView Başlıkları Döndürme (Çoğu iPad'de)

2 UITableViews'ı yan yana gösteren bir iPad uygulamasına sahibim. Portre'den Yatayya ve arkaya doğru döndüğümde, UITableView'deki hücreler dönüş sırasında mükemmel şekilde, anında, yeniden boyutlandırılır. UITableViewCellStyleSubtitle UITableViewCells (şu an için alt sınıf değil) kullanıyorum ve UITableView'ı, üst, sol ve alt kenarlara (sol UITableView için) sabitlemek ve esnek bir genişliğe sahip olmak için IB'de ayarlayın. Ben burada

- (UIView *)tableView:(UITableView *)tableView 
    viewForHeaderInSection:(NSInteger)section 

için kendi UIView nesnesi temin ediyorum

I (başka bir sınıftan bir sınıf yöntemi olarak adlandırılır) şimdiye kadar bu var:

+ (UIView *)headerForTableView:(UITableView *)tv 
{ 
    // The view to return 
    UIView *headerView = [[UIView alloc] 
     initWithFrame:CGRectMake(0, 0, [tv frame].size.width, someHeight)]; 

    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 
            UIViewAutoresizingFlexibleLeftMargin | 
            UIViewAutoresizingFlexibleRightMargin]; 

    // Other layout logic... doesn't seem to be the culprit 

    // Return the HeaderView 
    return headerView; 
} 

Yani, ya yönelim, her şey istediğim gibi yüklenir. Rotasyondan sonra, reloadData öğesini manuel olarak çağırırsam veya uygulamam tetiklenene kadar beklerse veya UITableView öğesini kaydırırsa, headerViews yeniden boyutlandıracak ve kendilerini uygun şekilde gösterecektir. Anlayamadığım şey, AutoResizeMask özelliğinin doğru şekilde ayarlanmasını sağlamak, böylece üstbilginin hücreler gibi yeniden boyutlandırılmasıdır.

+0

: başlıklarını genişlikleri tabloyla değişen olmadığını sorun, onların yükseklikleri değiştirmek beklediklerini veya gerçekleşmesi değişiklikler animasyonlu edilmiyor yani, masanın dönüşü ile? –

+0

Bunu uzun zamandır görmedim, ama bir şey derhal gözden geçirme üzerine bana sıçradı. Benim sorunum esnek genişlik VE esnek sağ ve sol kenar boşlukları ile ilgili olduğunu tahmin ediyorum. Böyle bir senaryo altında yatay yeniden boyutlandırma davranışını nasıl tahmin edeceğini kim bilebilir? AutoResizingMask'ı sadece esnek genişliğe ayarlamanın cevabın olacağını söyleyebilirim. Yine de, aşağıda söylediğim gibi tamamen farklı bir çözüme geçtim. – mbm29414

cevap

15

Çok iyi bir düzeltme değil. Ama işler:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    [mTableView reloadData]; 
} 
+1

Bunun işe yarayacağı doğru, ama bu biraz kludgy. – mbm29414

+0

bir çekicilik gibi çalışır ... Onun özel API değil mi? –

+0

Burada kullanılan tüm yöntemler halka açık olan –

0

benim "başlıkları" sadece tablonun içine hücrelerdir olabilmesi için, bu gerçek bir cevap almak isteriz, ama şimdi, sadece benim UITableView yeniden çalıştık. Yeniden boyutlandırmanın bu şekilde bir sorunu yok.

+0

bu yolu denedim İşte Swift içinde çözüm. Ancak, birden fazla hücre görünümüne ve bölümünüz varsa, hücreleri kontrol etmek zordur. –

5

Son zamanlarda aynı sorunu yaşadım. Hile, tablonun başlığı olarak özel bir görünüm kullanmaktı. LayoutingSubviews, yerleşimi istediği zaman kontrol etmeme izin verdi. Aşağıda bir örnek.

#import "TableSectionHeader.h" 

@implementation TableSectionHeader 

- (id)initWithFrame:(CGRect)frame title:(NSString *)title 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     self.backgroundColor = [UIColor clearColor]; 

     // Initialization code 
     headerLabel = [[UILabel alloc] initWithFrame:frame]; 
     headerLabel.text = title; 

     headerLabel.textColor = [UIColor blackColor]; 
     headerLabel.font = [UIFont boldSystemFontOfSize:17]; 
     headerLabel.backgroundColor = [UIColor clearColor]; 

     [self addSubview:headerLabel]; 
    } 
    return self; 
} 

-(void)dealloc { 

    [headerLabel release]; 

    [super dealloc]; 
} 

-(void)layoutSubviews { 

    [super layoutSubviews]; 

    NSInteger xOffset = ((55.0f/768.0f) * self.bounds.size.width); 

    if (xOffset > 55.0f) { 
     xOffset = 55.0f; 
    } 

    headerLabel.frame = CGRectMake(xOffset, 15, self.bounds.size.width - xOffset * 2, 20); 
} 

+(UIView *) tableSectionHeaderWithText:(NSString *) text bounds:(CGRect)bounds { 
    TableSectionHeader *header = [[[TableSectionHeader alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, 40) title:text] autorelease]; 
    return header; 
} 

+(CGFloat) tableSectionHeaderHeight { 
    return 40.0; 
} 
@end 
+0

layoutsubviews çalıştı – biorbnA

+0

@washfaq Mükemmel cevap.Oy veriliyor ... –

0

Ben ekranın yanlarına subview sopa görsel kısıtlamaları kullandım UIView alt sınıfı oluşturduk. Ve rotasyon her şey yolunda.

Bu sorunuza beri bana net değil
class MLFlexibleView: UIView { 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    self.addSubview(self.segmentedControl) 
    self.setUpConstraints() 
} 

func setUpConstraints() { 
    let views = ["view" : self.segmentedControl] 

    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-7-[view]-7-|", options: [], metrics: nil, views: views)) 
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-15-[view]-15-|", options: [], metrics: nil, views: views)) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

let segmentedControl:UISegmentedControl = { 
    let segmentedControl = UISegmentedControl(items: ["Searches".localized, "Adverts".localized]) 
    segmentedControl.selectedSegmentIndex = 0 
    segmentedControl.tintColor = UIColor.white 
    segmentedControl.translatesAutoresizingMaskIntoConstraints = false 
    return segmentedControl 
}() 

} 
İlgili konular