2011-10-20 11 views
11

Mi sento come se questa fosse una semplice risposta che ruotava attorno a AutoResizingMasks, ma non riesco a spiegarmi questo argomento.Ridimensiona automaticamente le intestazioni UITableView su Ruota (Principalmente su iPad)

Ho un'app per iPad che mostra 2 UITableViews side-by-side. Quando ruoto da Verticale a Orizzontale e viceversa, le celle di UITableView si ridimensionano perfettamente, al volo, mentre avviene la rotazione. Sto usando UITableViewCellStyleSubtitle UITableViewCells (non sottoclasse per ora), e ho impostato UITableView in IB per ancorare ai bordi superiore, sinistro e inferiore (per UITableView sinistro) e avere una larghezza flessibile.

sto fornendo il mio proprio oggetto UIView per

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

Ecco quello che ho finora (chiamato come metodo di classe da un'altra classe):

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

Così, in entrambi i orientamento, tutto si carica proprio come voglio. Dopo la rotazione, se richiami manualmente reloadData o attendi fino a quando la mia app non lo attiva, o scorri UITableView, l'headerView sarà ridimensionato e mostrato correttamente. Quello che non riesco a capire è come ottenere correttamente la proprietà AutoResizeMask impostata in modo che l'intestazione si ridimensiona proprio come le celle.

+0

Non è chiaro per me dalla tua domanda: è il problema che le larghezze delle intestazioni non stanno cambiando con la tabella, che ci si aspetta loro altezze di cambiare, o che i cambiamenti che si verificano non sono essere animato con la rotazione del tavolo? –

+0

Non l'ho visto da molto tempo, ma una cosa mi è subito venuta in mente dopo la recensione. Immagino che il mio problema fosse legato alla larghezza flessibile e ai margini flessibili destro e sinistro. Chi sa come prevedere il comportamento di ridimensionamento orizzontale in un tale scenario? Scommetto che l'impostazione di AutoResizingMask su una larghezza flessibile sarebbe stata la risposta. Di nuovo, tuttavia, come ho detto di seguito, mi sono trasferito su una soluzione completamente diversa. – mbm29414

risposta

15

Non è una soluzione molto buona. Ma funziona:

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

È vero che funzionerà, ma è un po 'cauto. – mbm29414

+0

funziona come un incantesimo ... La sua API non privata è? –

+0

tutti i metodi usati qui sono pubblici –

0

Mi piacerebbe ottenere una risposta reale a questo, ma per ora, ho appena ri-lavorato la mia UITableView in modo che i miei "headers" sono solo le celle all'interno della tabella. Il ridimensionamento non ha problemi in questo modo.

+0

ho provato in questo modo. Ma è difficile controllare le celle se hai più viste e sezioni di celle. –

5

Ho affrontato lo stesso problema di recente. Il trucco era usare una vista personalizzata come headerView della tabella. Sovrapposizione del layout Le visualizzazioni di visualizzazione mi hanno permesso di controllare il layout a piacimento. Di seguito è un esempio.

#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 lavorato – biorbnA

+0

@washfaq Risposta eccellente.Votare ... –

0

Ho creato sottoclasse UIView in cui ho utilizzato vincoli visivi per incollare la vista secondaria ai lati dello schermo. E la rotazione va bene.

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

}