2015-05-19 32 views
51

Rozszerzenie Moje Dzisiaj musi mieć dynamiczną wysokość w zależności od zawartości wyświetlanej widgetu. Udało mi się to osiągnąć, dodając ograniczenie do mojego najbardziej dolnego elementu: górna krawędź prowadnicy u dołu jest mniejsza lub równa dolnej części elementu, o stałej 0, priorytecie 999, mnożniku 1.Dzisiaj Wysokość rozszerzenia dla iPada znacznie większa niż podana

To działa dokładnie zgodnie z oczekiwaniami na iPhone'ach - wysokość widgetu pasuje do całej zawartości, a domyślny dolny margines jest stosowany przed wyświetleniem następnego widgetu.

Ale na iPadzie wygląda na to, że ustawiam wysokość widżetu równą maksymalnej wysokości. Centrum powiadomień pozwoli na wyświetlanie widżetu - pod moim widżetem jest dużo miejsca, prawie na pełnym ekranie.

Jak mogę usunąć dodatkowe miejsce?

Wiem dokładnie, na czym polega problem, ale nie jestem pewien, jak go rozwiązać - patrz sekcja "Problem". Pozwól mi najpierw wyjaśnić konfiguracji:

Setup:
ustawić widok tego rozszerzenia jest w storyboard, nic nie odbywa się programowo. Widok składa się z 5 elementów ułożonych pionowo, a inne poziomo. Są to ograniczenia układu auto do tej pionowej linii od góry do dołu - gdzie nie wskazano priorytetem jest 1000, mnożnik 1:

UILabel: height = 35, top space to top layout guide with constant of 10 
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999 

niezbędną Zachowanie:

  • muszę siatkę Przyciski 4x4 umieszczone pod pojedynczą etykietą o pełnej szerokości
  • Każdy przycisk powinien mieć dokładnie taką samą szerokość i wysokość - wszystkie idealne kwadraty
  • Brak dodatkowej przestrzeni pod ostatnią r ow przycisków

Rezultat:
enter image description here

oczekiwany wynik:
enter image description here

Problem:
Ograniczenia współczynnik proporcji wszystkich przycisków w efekcie pośrednio narzucają aspekt "niejawny" ograniczenie tio na wysokości widoku widżetu, gdy jest ono wysyłane systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:, gdzie przekazuje ono niezbędną szerokość (724) dla układu o wymaganym priorytecie i wysokość 0 (aby skompresować widok) przy priorytecie poziomu dopasowania. Powoduje to, że na iPadzie widoczny jest wysoki widżet, w którym widok jest szerszy. Ale nie ma faktycznego ograniczenia proporcji, które można usunąć. Zasadniczo, ponieważ zastosowałem ograniczenia proporcji do wszystkich przycisków, wysokość dzisiejszego rozszerzenia zależy od jego szerokości (biorąc pod uwagę wszystkie ograniczenia łącznie, proporcje i inne). Tak więc wysokość rozszerzenia jest niezgrabna na szerokim obszarze, objawiając się na szerokim urządzeniu, takim jak iPad. Ograniczenia na przyciskach należy ponownie rozważyć lub w jakiś sposób dostosować.

przykładowy projekt:
sample project that demonstrates the issue jest dostępny od CloudApp więc można pobrać i grać z nim.

Co próbowałem:
Próbowałem usunięcie wypustki domyślny margines nadrzędnymi widgetMarginInsetsForProposedMarginInsets i powrocie 0 na dole. Usunęło to domyślne wypełnienie, dlatego nieco zmniejszyło wysokość, ale pod nim jest jeszcze dużo dodatkowej przestrzeni.

UILabel miał ograniczenia na to: etykieta wiodący równy wiodących Superview za - stała 0, priorytet 1000, mnożnik 1. Jeśli po prostu zmienić do Superview wiodących marginesu, dodatkowy dolny rozstaw magicznie znika. Zastanawiałem się, czy to dlatego, że elementy stały się zbyt duże, więc zwiększenie ilości lewego odstępu zmniejszyłoby ich rozmiar, ale starałem się utrzymywać go w stałym prowadzeniu i zwiększaniu stałej, a to nie rozwiązało problemu. Ale to rozwiązuje tylko problem dotyczący iPada w trybie portretu. I to nawet nie w pełni go rozwiązuje, za każdym razem, gdy niszczysz Centrum Notyfikacji, zaczyna się na dużej wysokości, a następnie kurczy się do odpowiedniego rozmiaru. W krajobrazie nigdy nie zmniejsza się do właściwego rozmiaru.

Próby rozwiązania:

  • @Lefteris zaproponował hardcoding wielkości, która nie będzie działać w tym przypadku jak wysokość jest dynamiczna i widżet jest dostępny w wielu rozmiarach ekranu /orientacjach.
  • @Yuyutsu próbował go rozwiązać, ale niestety nie spełnia wymagań i wykazuje sprzeczne ograniczenia i zmodyfikowany układ.
+0

mam jakieś dziwne problemy dotyczące wysokość dzisiejszego rozszerzenia kilka dni temu, przeczytaj ten FYI: http://stackoverflow.com/questions/26087907/height-of-ios8-today-extension-using-only-auto-layout-gives-broken-constraints – liushuaikobe

+0

try tworzenie widoku rozszerzenia jako podglądu innego niestandardowego kontrolera widoku, a następnie zastosowanie w nim metody viewDidLoad(), powinno działać –

Odpowiedz

-1

musiałem hardcode wartość widget sprawie sposobu viewDidLoad delegata w celu ustalenia to:

import UIKit 
import NotificationCenter 

class TodayViewController: UIViewController, NCWidgetProviding { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.preferredContentSize = CGSize(width: 0, height: 320) 
    } 

} 
+1

Nie może być trudne, musi być dynamiczne w zależności od zawartości. Musi działać na wszystkich iPhone'ach i iPadach oraz na każdym innym przyszłym rozmiarze ekranu. – Joey

+0

Twarde kodowanie wysokości prawie na pewno się nie powiedzie w niektórych sytuacjach - na przykład w trybie poziomym. Spróbuj: uruchom Mobile Safari, przejdź do trybu poziomego, a następnie otwórz centrum powiadomień. –

0

byłem stoi ten sam problem. Czy dodano ograniczenie na dole wypełnienia, jak pokazano na obrazku? enter image description here

który pracował dla me.Hope pomaga

2

enter image description here

Oto jak to osiągnąć:

  1. Należy rozważyć ograniczenie.

  2. widgetów wypustkami domyślnych marginesów nie są poprawnie skonfigurowane na sposób, w jaki go pożądanym, więc ustawienie tego na własną rękę to tylko obejście tutaj przez wywołanie „widgetMarginInsetsForProposedMarginInsets:”

// Aktualizuj widgety wypustkami

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 

    println(NSStringFromUIEdgeInsets(defaultMarginInsets)) 
    return UIEdgeInsetsMake(20, 20, 10, 20) 
} 

Modified Link przykładowy plik: Modified file

+0

Przyciski muszą być doskonałymi kwadratami – Joey