2014-10-03 13 views
10

Su iOS 8, per i dispositivi più grandi, sembra che l'inserto predefinito di tableView cambi. Se stai creando celle personalizzate e abbinandone il vincolo di layout sinistro alla dimensione predefinita 15 per una cella, il layout apparirà corretto su dispositivi più piccoli, ma su dispositivi più grandi in cui l'insetto cambia otterrai qualcosa di simile al seguente :iOS 8 UITableView inserto: se hai celle con layout personalizzato, probabilmente avrai questo problema anche



TableViewCell separator inset alignement



Come posso risolvere questo problema?

+0

Puoi mostrarci una foto del problema? –

+0

@MarcusAdams fatto. –

+0

Hai davvero bisogno di fare un layout personalizzato per le tue cellule? La tua prima cella appare come una cella standard con stile 'UITableViewCellStyleValue1' – Clafou

risposta

3

riuscito a scrivere qualcosa che sembra lavorare bene. Se c'è una soluzione più carina, per favore condividi.

@interface InsetRespectingTableViewCell() 

@property (nonatomic) IBOutlet NSLayoutConstraint * leftContentInset; 
@property (nonatomic) IBOutlet NSLayoutConstraint * rightContentInset; 

@end 

@implementation InsetRespectingTableViewCell 


- (UITableView *)tableView { 

    UIView *view; 
    for (view = self.superview; ![view isKindOfClass:UITableView.class] && view; view = view.superview); 
    return (UITableView *)view; 

} 

- (void)updateInset { 

    CGFloat defaultInset = [self tableView].separatorInset.left; 
    self.leftContentInset.constant = defaultInset; 
    self.rightContentInset.constant = defaultInset; 

} 

- (void)didMoveToSuperview { 

    [super didMoveToSuperview]; 
    [self updateInset]; 

} 
+2

Per il modo corretto di farlo, controlla [questo post] (http://stackoverflow.com/questions/27420888/uitableviewcell-with-autolayout-left-margin-different-on-iphone-and-ipad) – yilin

4

Non esiste alcuna opzione/proprietà in Xcode6 per risolverlo. C'è un metodo setter setSepratorInset che imposta il valore di inset. Ma non possiamo passare (-ve) valore a <#CGFloat left#> per avviarlo da sinistra. Come il suo valore minimo è sempre 0.

[tableView setSeparatorInset:UIEdgeInsetsMake(<#CGFloat top#T, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)]; 

Se si desidera ottenere è risolvere poi nascondere la linea di separazione e aggiungere un IMAGEVIEW di 1px con la larghezza desiderata per creare una linea e inserirlo alla cella e che la volontà anche lo stesso aspetto su ogni dispositivo.

+1

Non so perché sia ​​così votato .... non risolve il problema. –

2

Sono stato in grado di utilizzare i vincoli di dimensioni per abbinare l'aspetto su tutto tranne l'iPhone 6+, purché bloccato con iOS 8. Risolvere l'aspetto su iOS 8 lo ha rotto su iOS 7. L'approccio di base che ho usato è stato quello di impostare i vincoli in modo diverso per "Regular Larghezza | Qualsiasi Altezza" e sull'uso di inserti di 13 px invece di 7 px:

  1. definire il layout vista utilizzando layout automatico con +/- spazio 7 px a super contenitore.
  2. Selezionare il vincolo di layout dall'elenco a sinistra
  3. Nell'editor di proprietà all'estrema destra, fare clic su (+) accanto a costante e selezionare "Larghezza regolare | Qualsiasi altezza" dal popup. Questo aggiungerà una nuova riga sotto Costante.
  4. modificare il valore da 7 a 13.

non è una soluzione completa, ma è un inizio.

1

È molto interessante.

Nel progetto creato da Xcode5 l'inserto sinistro del separatore è 15/15/16 (iPhone5s/iPhone6 ​​/ iPhone6P).

E nel progetto creato da Xcode6 è 16/16/20 (iPhone5s/iPhone6 ​​/ iPhone6P).

Nel mio caso, disattivo il separatore predefinito in tableView e ho creato una baseCell per ridisegnare il separatore.

link: https://github.com/jshl8612/UTableViewBaseCell

spera che aiuta un po '.

2

Nota - se è necessario aggiungere una vera linea un pixel, non ingannare con un'immagine, utilizzare questo:

@interface UILine : UIView 
@end 

@implementation UILine 

-(void)awakeFromNib 
    { 
    float sortaPixel = 1.0/[UIScreen mainScreen].scale; 

    // float sortaPixel = 1.0/self.contentScaleFactor; 
    // -- recall, that does NOT work when loading from storyboard! 

    UIView *line = [[UIView alloc] initWithFrame: 
    CGRectMake(0, 0, self.frame.size.width, sortaPixel)]; 

    line.userInteractionEnabled = NO; 
    line.backgroundColor = self.backgroundColor; 

    line.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

    [self addSubview:line]; 

    self.backgroundColor = [UIColor clearColor]; 
    self.userInteractionEnabled = NO; 
    } 

@end 

Come utilizzare in storyboard, basta fare un UIView che è nel posto esatto, e la larghezza esatta, tu vuoi. (Naturalmente, allungalo alla larghezza, o qualsiasi altra cosa sia necessaria.)

Basta fare la vista - diciamo - 5 pr ad alta 6 pixel - puramente per poterla vedere correttamente. (Non importa quanto in alto si rendono nello storyboard.)

(fare la parte superiore del UIView esattamente dove si desidera che la linea di single-pixel.)

Rendere l'UIView qualsiasi colore desiderato, probabilmente nero.

Modificare la classe su UILine. In fase di esecuzione disegnerà una perfetta linea a pixel singolo nella posizione esatta su tutti i dispositivi.

Spero che questo aiuti in questo modo.

+0

solo una nota a piè di pagina - nel moderno IB, potresti probabilmente usare ** @ IBDesignable ** per farlo visualizzare come una visualizzazione personalizzata, più facilmente, nello storyboard. per objC http://stackoverflow.com/a/24465867/294884 – Fattie

0

Ecco come può essere risolto.

@IBOutlet weak var leftViewLeadingConstraint: NSLayoutConstraint! 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    switch UIScreen.mainScreen().scale { 
    case 2: 
     leftViewLeadingConstraint.constant = 7.0 
    case 3: 
     leftViewLeadingConstraint.constant = 11.0 
    default: 
     assertionFailure("Error: wrong scale value") 
    } 
} 
+0

Vuoi terminare l'app quando esce una nuova scala dello schermo e non hai aggiornato il tuo codice? Non sono sicuro che sia una buona idea ... inoltre, la risposta accettata non si basa sulle costanti di autoimpostazione, che potrebbero cambiare nelle versioni future di iOS. –

+0

So che non è una soluzione perfetta, ma in questo momento funziona per tutti gli schermi di iPhone. Ovviamente, per iPhone con un nuovo fattore di scala un'app dovrebbe essere aggiornata. –

Problemi correlati