2015-10-19 8 views
18

Sto riscontrando un problema con l'aspetto di UITableViewCell sull'iPad. Questo problema è sorto tra iOS 7 e ora, ma non so per certo quando è iniziato. Su un iPod o iPhone le mie celle sembrano belle (ritratto o paesaggio), ma sull'iPad, l'accessorio di divulgazione è molto ampio. Puoi vedere un esempio nell'immagine qui sotto. Il tablecell ha un bordo verde e il contentview ha un bordo marrone. La visualizzazione del contenuto è molto più piccola di quanto dovrebbe essere. Le celle di tabella senza l'accessorio di divulgazione sembrano buone.L'accessorio UITableViewCell è troppo largo su iPad

Example

Sto usando Xamarin, e sto creando completamente questa interfaccia utente in codice. Ecco il codice (ho omesso il codice che definisce l'interno delle cellule contentView poiché non è rilevante:.

protected void Draw() 
    { 
     Accessory = UITableViewCellAccessory.DisclosureIndicator; 

     Layer.BorderColor = UIColor.Green.CGColor; 
     Layer.BorderWidth = 1f; 

     Frame = new CGRect(0, 0, 320, 42); 
     ContentMode = UIViewContentMode.ScaleToFill; 
     AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth; 

     ContentView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth; 
     ContentView.MultipleTouchEnabled = true; 
     ContentView.ContentMode = UIViewContentMode.Center; 
     ContentView.ClipsToBounds = true; 
     ContentView.Layer.BorderColor = UIColor.Brown.CGColor; 
     ContentView.Layer.BorderWidth = 1f; 

    } 

Ho provato a cambiare la dimensione del contentView sovrascrivendo il metodo layoutSubviews della cellula Tuttavia, la contentView ora era larga come il tavolo, ma l'accessorio divulgazione non è cambiata e ora era al di sotto della contentView.

public override void LayoutSubviews() 
    { 
     base.LayoutSubviews(); 

     //ContentView.Frame = new CGRect(0, 0, Frame.Size.Width, ContentView.Frame.Size.Height); 
    } 

Ancora una volta, questo non è affatto un problema su iPhone o iPod. I don Non capisco cosa dovrei fare diversamente affinché l'iPad funzioni correttamente

Grazie. Zach verde

Edit - 10/21/2015 11:00 Per il momento, ho fatto un cambiamento molto hacky che fissa il problema per me, ma so che i futuri aggiornamenti iOS probabilmente rompere questo , quindi preferirei un modo più approvato iOS per farlo.

public override void LayoutSubviews() 
    { 
     base.LayoutSubviews(); 
     //!! - Hack for ipad layout issue with disclosure indicator 
     if (Accessory == UITableViewCellAccessory.DisclosureIndicator && UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad) 
     { 
      ContentView.Frame = new CGRect(0, 0, Frame.Size.Width - 32, ContentView.Frame.Size.Height); 

      foreach (var view in Subviews.OfType<UIButton>()) 
      { 
       view.Frame = new CGRect(Frame.Size.Width - 24, view.Frame.Y, 8, view.Frame.Height); 
      } 
     } 
    } 
+0

Il problema è che si sta hardcoding le dimensioni della cornice: 'frame = new CGRect (0, 0, 320, 42);' e impostando una larghezza fissa. Mentre l'iPhone ha una larghezza dello schermo di 320 pixel, l'iPad ha una larghezza dello schermo di 768 pixel, quindi questa interrompe la tua interfaccia utente – Lefteris

+0

quindi, dovrei semplicemente omettere quella linea? –

+0

Dopo aver guardato più da vicino il codice, sembra che tu non stia impostando le proprietà Frame o ContentMode o AutoresizingMask ovunque ... Perché stai inizializzando allora? – Lefteris

risposta

30

Ciò è dovuto al Mele nuovi margini di contenuto leggibile in iOS9 lo scopo di rendere i contenuti più leggibile nelle viste più ampie (iPad Pro).

È possibile disattivare questa funzione impostando

tableView.cellLayoutMarginsFollowReadableWidth = false 

in viewDidLoad

+2

Semplice e facile, questo ha fatto il trucco. Grazie ! – Aeradriel

+0

"_Questa guida al layout definisce un'area che può essere facilmente letta senza costringere gli utenti a muovere la testa per tracciare le linee_" ... Se avessi un centesimo per ogni libro l'ho buttato fuori a causa di un lieve movimento della testa .. – Coruscate5

+0

Ci sono voluti 4 ore per capire finalmente questo. Se voglio che una tabella o una cella sia più piccola, posso farlo in meno di 2 secondi. Perché diamine, questi ragazzi pensano di poter pasticciare con disegni personalizzati con un'opzione predefinita attivata! –

1

Utilizzare la stessa larghezza di quella di [UIApplication sharedApplication].keyWindow.frame.size.width anziché hardcoding valori.

4

provare questo codice:

protected void Draw() 
     { 
      Accessory = UITableViewCellAccessory.DisclosureIndicator; 

      Layer.BorderColor = UIColor.Green.CGColor; 
      Layer.BorderWidth = 1f; 

      Frame = new CGRect(0, 0, [UIApplication sharedApplication].keywindow.frame.size.width, 42); 
      ContentMode = UIViewContentMode.ScaleToFill; 
      AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth; 

      ContentView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth; 
      ContentView.MultipleTouchEnabled = true; 
      ContentView.ContentMode = UIViewContentMode.Center; 
      ContentView.ClipsToBounds = true; 
      ContentView.Layer.BorderColor = UIColor.Brown.CGColor; 
      ContentView.Layer.BorderWidth = 1f; 

     } 

public override void LayoutSubviews() 
    { 
     base.LayoutSubviews(); 
     //!! - Hack for ipad layout issue with disclosure indicator 
     if (Accessory == UITableViewCellAccessory.DisclosureIndicator && UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad) 
     { 
      ContentView.Frame = new CGRect(0, 0, [UIApplication sharedApplication].keywindow.frame.size.width - 32, ContentView.Frame.Size.Height); 

      foreach (var view in Subviews.OfType<UIButton>()) 
      { 
       view.Frame = new CGRect([UIApplication sharedApplication].keywindow.frame.size.width - 24, view.Frame.Y, 8, view.Frame.Height); 
      } 
     } 
    }