2015-10-19 11 views
18

Mam problem z pojawieniem się mojego UITableViewCell na iPadzie. Ten problem pojawił się między systemem iOS 7 a teraz, ale nie wiem na pewno, kiedy to się zaczęło. Na iPodzie lub iPhonie moje komórki wyglądają dobrze (portret lub krajobraz), ale na iPadzie akcesoria do przechowywania są bardzo szerokie. Możesz zobaczyć przykład na obrazku poniżej. Tablecell ma zieloną granicę, a zawartość ma brązową obwódkę. Widok zawartości jest znacznie mniejszy niż powinien. Komórki tabeli bez elementu ujawniającego wyglądają dobrze.UITableViewCell Akcesoria są zbyt szerokie na iPadzie

Example

Używam Xamarin i tworzę ten UI całkowicie w kodzie. Oto kod (I pominięto kod Układa wewnątrz komórek contentView ponieważ nie jest istotne.

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; 

    } 

Próbowałem zmiany rozmiaru contentView nadrzędnymi komórki metodę LayoutSubviews jednak contentView był teraz tak szeroki, jak stół, ale akcesorium ujawnienie nie uległ zmianie i był teraz pod contentView.

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

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

Ponownie, to nie jest w ogóle problem na iPhone lub iPod. i don "Rozumiem, co powinienem zrobić, aby iPad działał prawidłowo."

Dzięki. Zach Zielona

Edit - 21.10.2015 11:00 Na razie zrobiłem bardzo hacky zmianę, która naprawia ten problem dla mnie, ale wiem, że przyszłe aktualizacje iOS będzie prawdopodobnie podzielenie , więc wolałbym, aby to zrobić, bardziej zatwierdzony przez iOS.

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

Problem jesteś hardcoding rozmiar ramki: 'ramka = new CGRect (0, 0, 320, 42);' i ustawienie stałej szerokości. Podczas gdy iPhone ma szerokość ekranu 320 pikseli, iPad ma szerokość ekranu 768 pikseli, więc łamie to twój interfejs użytkownika – Lefteris

+0

, więc powinienem po prostu pominąć tę linię? –

+0

Po dokładniejszym przyjrzeniu się twojemu kodowi wydaje się, że nie ustawiasz właściwości Ramki lub ContentMode lub AutoresizingMask w dowolnym miejscu ... Dlaczego więc je inicjujesz? – Lefteris

Odpowiedz

30

Wynika to Jabłka Nowe marże treści czytelny w iOS9 przeznaczony do treści bardziej czytelny w szerszych widoków (iPad Pro).

można wyłączyć tę funkcję przez ustawienie

tableView.cellLayoutMarginsFollowReadableWidth = false 

w viewDidLoad

+2

Proste i łatwe, to wystarczyło. Dziękuję Ci ! – Aeradriel

+0

"_Ten przewodnik układu definiuje obszar, który można łatwo odczytać, nie zmuszając użytkowników do poruszania głową, aby śledzić linie" ... Gdybym miał bilon za każdą książkę, którą wyrzuciłem z powodu drobnego ruchu głowy .. – Coruscate5

+0

Zajęło 4 godziny, aby w końcu to zrozumieć. Jeśli chcę, aby stół lub komórka były mniejsze, mogę to zrobić w mniej niż 2 sekundy. Dlaczego, na litość boską, ci faceci myślą, że mogą po prostu zrzucić niestandardowe projekty z włączoną opcją domyślną! –

1

Użyj szerokości takiej samej, jak w przypadku [UIApplication sharedApplication].keyWindow.frame.size.width, a nie na kodowaniu wartości.

4

Spróbuj kod:

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