Automatyczna preferowana maksymalna szerokość układu nie jest dostępna w wersjach iOS starszych niż 8.0

322

Otworzyłem istniejący projekt iOS za pomocą Xcode6 beta6, a Xcode wyświetla następujące ostrzeżenie dla plików Storyboard i Xib:

Automatyczna preferowana maksymalna szerokość układu nie jest dostępna w wersjach iOS starszych niż 8.0

Próbowałem rozwiązać ostrzeżenie, ustawiając szerokość tak wyraźnie, jak poniżej:

To jednak nie rozwiązało ostrzeżeń. Jak można je usunąć?

mononukleoza
źródło
3
Używam XCode 6.1 i zaktualizowałem wszystkie moje etykiety do Preferred Width = Explicit. To rozwiązało problem dla mnie.
djburdick,

Odpowiedzi:

373

Aktualizacja 3:
To ostrzeżenie może być również wyzwalane przez etykiety, które mają numberOfLineswartość inną niż 1, jeśli docelowy poziom wdrożenia jest ustawiony na 7.1. Jest to całkowicie powtarzalne w przypadku nowego projektu z jednym widokiem.

Kroki ku reprodukcji:

  1. Utwórz nowy projekt typu single-view, target-c
  2. Ustaw cel wdrożenia na 7.1
  3. Otwórz scenariusz projektu
  4. Upuść etykietę na dostarczonym kontrolerze widoku
  5. Ustaw numberOfLines dla tej etykiety na 2.
  6. Skompilować


Zapisałem następujący radar: rdar: // problem / 18700567

Aktualizacja 2:
Niestety, jest to znowu kwestia w wydanej wersji Xcode 6. Zauważ, że w większości przypadków możesz ręcznie edytować storyboard / xib, aby rozwiązać problem. Per Charles A. w komentarzach poniżej:

Warto wspomnieć, że dość łatwo można przypadkowo wprowadzić to ostrzeżenie, a samo ostrzeżenie nie pomaga w znalezieniu winowajcy. Jest to niefortunne w złożonej scenariuszu. Możesz otworzyć scenorys jako plik źródłowy i wyszukać za pomocą wyrażenia regularnego, <label(?!.*preferredMaxLayoutWidth)aby znaleźć etykiety, które pomijają preferowany atrybut / wartość MaxMayLayoutWidth. Jeśli dodasz w preferowanych MaxMayLayoutWidth = "0" w takich wierszach, będzie to równoznaczne z zaznaczeniem jawnym i ustawieniem wartości 0.

Aktualizacja 1:
Ten błąd został teraz naprawiony w Xcode 6 GM.

Oryginalna odpowiedź
To jest błąd w Xcode6-Beta6 i XCode6-Beta7 i na razie można go bezpiecznie zignorować.

Inżynier firmy Apple na forach Apple, deweloper miał to do powiedzenia na temat błędu:

Preferowana maksymalna szerokość układu to właściwość automatycznego układu na UILabel, która pozwala mu automatycznie rosnąć w pionie w celu dopasowania do jego zawartości. Wersje Xcode wcześniejsze niż 6.0 ustawiałyby preferowanyMaxLayoutWidth dla etykiet wielowierszowych na bieżący rozmiar granic w czasie projektowania. W przypadku zmiany układu poziomego konieczne byłoby ręczne zaktualizowanie preferowanego MaxLayoutWidth w czasie wykonywania.

iOS 8 dodał obsługę automatycznego obliczania preferowanego MaxLayoutWidth w czasie wykonywania, co jeszcze bardziej ułatwia tworzenie etykiet wielowierszowych. To ustawienie nie jest wstecznie zgodne z iOS 7. Aby obsługiwać zarówno iOS 7, jak i iOS 8, Xcode 6 pozwala wybrać „Automatyczny” lub „Jawny” dla preferowanego MaxLayoutWidth w inspektorze wielkości. Powinieneś:

Wybierz „Automatyczny”, jeśli kierujesz reklamy na iOS 8, aby uzyskać najlepszą jakość. Wybierz „Jawne”, jeśli celujesz w <iOS 8. Możesz następnie wprowadzić wartość preferowanego MaxLayoutWidth, który chcesz ustawić. Włączenie opcji „Jawne” powoduje ustawienie domyślnego rozmiaru bieżących granic w momencie zaznaczenia pola.

Ostrzeżenie pojawi się, jeśli (1) korzystasz z automatycznego układu, (2) „Etykieta automatyczna” jest ustawiona dla etykiety wielowierszowej [możesz to sprawdzić w inspektorze rozmiaru etykiety] oraz (3) twój cel wdrożenia <iOS 8

Wygląda na to, że błąd polega na tym, że to ostrzeżenie pojawia się w przypadku dokumentów nieautomatycznych. Jeśli widzisz to ostrzeżenie i nie używasz automatycznego układu, możesz je zignorować.

Alternatywnie możesz obejść ten problem, używając inspektora plików w serii ujęć lub xib, o którym mowa, i zmień opcję „Kompilacje dla” na „Kompilacje dla systemu iOS 8.0 i nowszych” Inspektor plików Xcode

memmons
źródło
15
Warto wspomnieć, że dość łatwo można przypadkowo wprowadzić to ostrzeżenie, a samo ostrzeżenie nie pomaga w znalezieniu winowajcy. Jest to niefortunne w złożonej scenariuszu. Możesz otworzyć scenorys jako plik źródłowy i wyszukać za pomocą wyrażenia regularnego, <label(?!.*preferredMaxLayoutWidth)aby znaleźć etykiety, które pomijają preferredMaxLayoutWidthatrybut / wartość. Jeśli dodasz do preferredMaxLayoutWidth="0"takich wierszy, będzie to równoznaczne z zaznaczeniem jawnym i ustawieniem wartości 0.
Charles A.
6
Czy istnieje jakiś sposób programowy do skonfigurowania UILabel w celu automatycznego dostosowania preferowanego MaxLayoutWidth, bez faktycznej jego podklasy lub implementacji gdzieś w widoku layoutSubviews? Jeśli jest to zachowanie, które IB może włączyć, sugeruje to, że istnieje właściwość lub wartość magiczna, którą można ustawić. Ale nic w dokumentach API lub nagłówkach tego nie mówi.
algal
2
@CharlesA. Testowałem z pustym projektem i znalazłem inny atrybut etykiety, który wyzwoli to ostrzeżenie: jeśli numberOfLinesjest ustawiony na cokolwiek innego niż 1, ostrzeżenie będzie się pojawiać niezależnie od tego, czy zostało preferredMaxLayoutWidthustawione, czy nie.
memmons,
2
@ MichaelG.Emmons Dziwne, nie mogę tego odtworzyć z czystym projektem i celem wdrożenia ustawionym na 7.1. Po ustawieniu preferredMaxLayoutWidthjawnego 0 ostrzeżenie zniknie bez względu na numberOfLineswartość. Ale może to zostało naprawione w aktualizacji Xcode dziś rano?
Charles A.
2
Więc ... jest jedynym rozwiązaniem, aby ustawić liczbę wierszy na 1 i zmienić ją z kodu? to nie wydaje się profesjonalne
Jomafer
315

Aby znaleźć etykiety problemów w dużym scenariuszu, wykonaj moje kroki poniżej.

  1. W Issue Navigator xCode kliknij błąd prawym przyciskiem myszy i wybierz „Reveal In Log”. (Uwaga: @Sam sugeruje poniżej, zajrzyj do nawigatora raportów xCode . Również @Rivera zauważa w komentarzach, że „Począwszy od Xcode 6.1.1, kliknięcie ostrzeżenia automatycznie otworzy się i podświetli sprzeczną etykietę”. Nie testowałem tego ).

wprowadź opis zdjęcia tutaj

  1. Spowoduje to wyświetlenie błędu z kodem na końcu pliku scenorysu. Skopiuj wartość po .storyboard

wprowadź opis zdjęcia tutaj

  1. Następnie ujawnij swoją scenorys jako plik źródłowy. wprowadź opis zdjęcia tutaj

  2. Szukaj. Powinieneś być w stanie dość łatwo stwierdzić, która to etykieta stąd, patrząc na treść. wprowadź opis zdjęcia tutaj

Po znalezieniu etykiety rozwiązaniem, które działało dla mnie, było ustawienie „preferowanej szerokości” na 0.

wprowadź opis zdjęcia tutaj

BTW, zawsze możesz szybko uzyskać identyfikator elementu interfejsu, wybierając element i sprawdzając pod identyfikatorem inspektora. Bardzo przydatny.

wprowadź opis zdjęcia tutaj

smileBot
źródło
36
To powinna być zaakceptowana odpowiedź! To faktycznie rozwiązuje problem. Pomaga nawet znaleźć inne problemy w Storyboard, które nie pojawiają się normalnie. Jedna rzecz: uważam, że Nawigator raportów jest znacznie bardziej niezawodny niż kliknięcie prawym przyciskiem myszy „Reveal in Log”
Sam Spencer
1
Podoba mi się ta odpowiedź, bardzo prosta i naprawiona ostrzeżenie. Dzięki wielkie!
Ethan Parker,
1
Dziękuję bardzo, bardzo dużo :)
SR Nayak
2
Dlaczego ustawiasz preferowaną szerokość na zero zamiast na szerokość pokazaną w narzędziu do tworzenia interfejsów?
Biclops,
9
Świetna odpowiedź! Możesz wyszukać identyfikator obiektu bezpośrednio z widoku IB Storyboard. Po prostu zrób Ctrl-f. Nie trzeba go otwierać jako kodu źródłowego, a następnie trzeba wrócić do widoku IB, aby zmienić preferowaną szerokość.
AndroidDev,
36

Możesz rozwiązać ten problem bez otwierania scenorysu jako źródła . To ostrzeżenie jest wywoływane przez UILabels, jeśli liczbaOpLinii! = 1, a docelowy poziom wdrożenia wynosi <8.0

JAK TO ZNALEŹĆ?

  1. Przejdź do Issue Navigator (CMD + 8) i wybierz najnowszą wersję z ostrzeżeniem wprowadź opis zdjęcia tutaj
  2. Znajdź ostrzeżenia ( wyszukaj „ Automatyczny preferowany maksymalny układ ”) i naciśnij przycisk rozwijania po prawej stronie
    wprowadź opis zdjęcia tutaj
  3. Znajdź identyfikator obiektu UILabel wprowadź opis zdjęcia tutaj
  4. Otwórz Storyboard i SEARCH (CMD + f) dla obiektu. Będzie SELECT i podkreślić ten UILabel
  5. Ustaw preferowaną szerokość = 0 „Jawne”, jak sugerowali inni
Tibidabo
źródło
23

Rozwiązanie jest dość proste

Wystarczy włączyć kompilacje dla iOS 8 i nowszych

wprowadź opis zdjęcia tutaj

Alejandro Luengo
źródło
dość prosty i destrukcyjny. Tylko 85% użytkowników iOS korzysta z iOS8 + developer.apple.com/support/app-store
aryaxt
6
@aryaxt Przykro mi powiedzieć, że się mylisz. Możesz ustawić cel wdrożenia w ustawieniach projektu na iOS 7 lub niższy i zmienić Kompilacje dla w Dokumentach IB na iOS 8 i nowsze wersje, i to będzie działać na iOS 7. Sprawdź to i usuń głosowanie negatywne. Możesz to sprawdzić tutaj developer.apple.com/library/ios/recipes/…
Alejandro Luengo
1
Jak zawsze najlepsza odpowiedź nie jest zaakceptowana ... :) Pozdrawiam!
HepaKKes
AKTUALIZACJA dla iOS 9.3 i nowszych: urządzenia z iOS7 nie renderują już scenorysów z powyższym ustawieniem. To działało przed aktualizacją 9.3. Wygląda na to, że Apple zmieniło coś w swoim automatycznym procesie przedpremierowym.
pechar
4

Teraz moja wersja Xcode to 6.1. Ale dostałem też to ostrzeżenie. bardzo mnie to denerwuje. po wyszukiwaniu raz po raz. znalazłem rozwiązanie.

Powód: Musisz ustawić swoje linie UILabel> 1 w Storyboard.

Rozwiązanie: ustaw atrybut UILabel Lines na 1 w Storyboard. zrestartuj swój Xcode. To działa dla mnie, mam nadzieję, że może pomóc większej liczbie osób.

Jeśli naprawdę chcesz pokazać swoje słowa w więcej niż 1 linii. powinieneś to zrobić w kodzie.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;
ronan
źródło
3
„Jeśli naprawdę chcesz pokazać słowa w więcej niż 1 linii. Powinieneś to zrobić w kodzie”. To jest troll, prawda?
webstersx
@webstersx myślę, że jest poważny
Jasper
4

Podsumowując, dla mnie wykonanie dwóch powyższych instrukcji, aby zmienić wszelkie przypadki, w których numberOfLines = od 0 do 1 lub więcej, i ręczne dodanie preferowanego MaxMayLayoutWidth = „0” do każdej instancji etykiety w źródle scenorysu naprawiło wszystkie moje ostrzeżenia.

Lynn S.
źródło
Stary, jesteś KREATOREM! Działa nawet z UIScrollerView zgodnie z oczekiwaniami. NAJLEPSZE ROZWIĄZANIE do tej pory, ponieważ mogłem pozostawić cel wdrożenia mojej stalówki na iOS7.0
Yaro
3

Ponieważ nie mam 50 reputacji Stackoverflow, nie będę mógł komentować drugiej najlepszej odpowiedzi. Znaleziono kolejną sztuczkę polegającą na znalezieniu winowajcy w Storyboard.

Więc kiedy znasz identyfikator etykiety, otwórz scenorys w osobnej karcie z wyświetlonymi kontrolerami widoku i po prostu wykonaj komendę F i komendę V, a zabierze Cię prosto do tej etykiety :)

Junaid Ahmed
źródło
Masz na myśli wyszukiwanie w projekcie identyfikatora etykiety.
Borzh
2

Uruchomiłem go, wybierając oryginalny układ, który miałem w wyborze W / H. Storyboard działa zgodnie z oczekiwaniami i błąd zniknął.

Upewnij się także, że pracujesz na iOS 8.0. Sprawdź to w ogólnych ustawieniach projektu.

Tutaj należy nacisnąć.

AarneHuttunen
źródło
1

Miałem ten problem i byłem w stanie go naprawić, dodając ograniczenia określające maksimum dla etykiety.

Po upuszczeniu etykiety wielowierszowej nie ma ustawionego ograniczenia wymuszającego szerokość w widoku nadrzędnym. Tutaj zaczyna się nowa PreferredMaxWidth. W iOS 7 i wcześniejszych musisz samodzielnie określić maksymalną szerokość. Po prostu dodałem ograniczenie 10px do lewej i prawej strony etykiety.

Możesz także dodać ograniczenie szerokości <=, które również rozwiązuje problem.

Więc to nie jest błąd, po prostu sam musisz zdefiniować maksymalną szerokość. Opcja wyraźnej wzmianki w innej odpowiedzi będzie również działać, gdy ustawiasz tę wartość szerokości, jednak będziesz musiał zmodyfikować tę wartość, jeśli chcesz, aby maksymalna szerokość zmieniła się na podstawie szerokości nadrzędnej (ponieważ wyraźnie ustawiłeś szerokość).

Moje powyższe rozwiązanie zapewnia, że ​​szerokość jest zawsze zachowywana bez względu na to, jak duży jest widok rodzica.

Matthew Cawley
źródło
1

Z jakiegoś powodu, nawet jeśli zmienisz docelowy cel wdrażania iOS na 8.0 lub wyższy, pliki Xib nie przyjmą tej zmiany i pozostaną przy poprzednich ustawieniach w Inspektorze plików

Inspektor plików na Xibie po zmianie celu wdrożenia iOS

Dlatego powinieneś zmienić go ręcznie dla każdego Xib Po ręcznej zmianie

Po zakończeniu ostrzeżenie zniknie :-)

Gutty1
źródło