Pobrałem nowy Xcode iw Interface Builder mam mnóstwo problemów z ostrzeżeniami, które mówią:
Ograniczenia stałej szerokości mogą powodować przycinanie
To wygląda tak:
Mam lokalizację na kilka języków i rozumiem ostrzeżenie, że w innym języku rozmiar etykiety może się zmienić, ale moja aplikacja nie ma tego problemu. Wczoraj uruchomiłem go i przetestowałem w Xcode 8, było dobrze. Nie chcę spędzać wielu godzin na dodawaniu bezcelowych nowych ograniczeń.
Jakieś sugerowane rozwiązania?
Odpowiedzi:
Otrzymywałem te same ostrzeżenia, nawet bez wielu języków w mojej aplikacji , co doprowadziło mnie do ustalenia, co naprawdę się dzieje. . .
Dzieje się tu kilka różnych rzeczy. Udało mi się wyciszyć ostrzeżenia o stałej szerokości we własnej aplikacji, zmieniając szerokość odstępów między obiektami ze stałej szerokości na większą lub równą lub mniejszą lub równą .
Można to zrobić, wybierając obiekt w konstruktorze interfejsu, przechodząc do inspektora rozmiaru i tam go zmieniając:
Lub wybierz ograniczenie z konspektu dokumentu, przejdź do inspektora rozmiaru i tam go zmień:
Jeśli chodzi o ostrzeżenie u góry zrzutu ekranu:
Oto zrzut ekranu z mojej własnej aplikacji, w którym otrzymałem dokładnie to samo ostrzeżenie:
Miałem etykietę ze znakiem @ ustawioną na początku i na końcu przycisków, ale także na wyrównaniu środka z etykietą oceny . Po usunięciu ograniczenia wyrównania do środka ostrzeżenie zniknęło, ale zostałem z nieprawidłowo ułożonym zestawem obiektów.
Wtedy zrezygnowałem z przyjęcia widoku stosu . Choć jest to denerwujące w użyciu, gdy wszystkie ograniczenia i ustawienia są prawidłowe, układa się pięknie i bez ostrzeżeń.
Edytować
Jak pisze Repose w komentarzach, czasami wystarczy po prostu dodać> = 0, ponieważ upewniasz się, że dwa elementy się nie nakładają.
źródło
Możesz spróbować wyłączyć opcję „Przestrzegaj kierunku językowego” na podstawie ograniczeń, aby wyciszyć ostrzeżenie i sprawdzić, czy to pomaga. Wybierz swoje ograniczenie i otwórz Attributes / Size Inspector. Zobacz załączone zdjęcie.
Jeśli nie planujesz zlokalizować swojej aplikacji na inne języki, to rozwiązanie nie powinno mieć żadnych wad. W przypadku aplikacji zlokalizowanych musisz być bardziej świadomy swoich etykiet i rozmiarów czcionek.
ps To rozwiązanie działa na iOS. W systemie macOS spróbuj> = lub <=, aby wyciszyć ostrzeżenie.
pps Etykiety na poniższym obrazku są znacznie łatwiejsze do utworzenia przy użyciu AutoLayout i właściwości attributeString na pojedynczym UILabel lub UITextView przy użyciu NSMutableAttributedString. Obraz służy wyłącznie do celów demonstracyjnych.
źródło
W przypadku zlokalizowanych etykiet i przycisków to ostrzeżenie ma sens i należy zapewnić niezbędne ograniczenia, aby etykiety się nie nakładały. Jeśli nie nakładają się teraz, mogą w przyszłości, więc zapewnienie ograniczeń nie zaszkodzi.
Xcode pomaga automatycznie dodawać te ograniczenia:
W konspekcie dokumentu swojego storyboardu kliknij żółtą strzałkę i wybierz „stały początek” lub „ustalony koniec”, w zależności od tego, gdzie tekst znajduje się na ekranie (po lewej lub po prawej). To rozwiąże większość problemów.
Jeśli masz ten problem z przyciskiem bez tekstu (tylko obraz), spróbuj usunąć „domyślny tytuł”, który nadal może być ustawiony dla przycisku:
źródło
UIButton
doStoryboard
,default button
tytuł będziebutton
.Dzięki
Labels
, można ustawićLines
to0
iAutoshrink
właściwości jestMinimum Font Size
usunięcieFixed Width Constraints May Cause Clipping
ostrzeżenia, jak poniżej:źródło
Kolejne szybkie rozwiązanie!
W przypadku przycisku UIButton, zmiana tytułu ze zwykłego na tekst przypisany również rozwiązała mój problem: -
źródło
Wiem, że odpowiedź na to pytanie została już udzielona, ale aby naprawić ten błąd w moim przypadku, dodałem właściwość „Współczynnik proporcji”, a następnie wyeliminowałem ograniczenie szerokości lub wysokości, co działało całkiem dobrze i było mniejszym wysiłkiem, a udało mi się zachować ten sam wynik i dostosuj mój widok do różnych urządzeń.
źródło
Swift 4, Xcode 9.1:
Jeśli chodzi o ten problem, myślę, że twój obiekt nie wie, jaka jest prawidłowa pozycja środkowa w kontekście jego superwizji , a używanie usuń, większe niż lub inne ustawienia wyprzedzania / usuwania w większości przypadków nie działa poprawnie. Najpierw musisz sprawdzić poprawne ograniczenia swojego superwizji.
Jeśli twój nadzór / y są poprawnie ustawione, możesz spróbować „wyjaśnić” swojemu obiektowi, jakie jest prawidłowe położenie w widoku, ustawiając ograniczenie „poziomo w kontenerze” :
źródło
Jeśli potrzebujesz stałego ograniczenia szerokości dla przycisku, po prostu ustaw priorytet ograniczenia szerokości na
700
.źródło
Miałem ten sam problem, ale kiedy zmieniam na
>=
to automatycznie ustawiam stałą na0
, jeśli60
np. Wybiorę, ostrzeżenie pojawia się ponownie. Więc byłem w pętli z problemem.Mogę naprawić osadzanie mojego
Label
wView
W
Label
ustawićTop
,Bottom
,Leading
orazTrailing
zconstant = 0
W
View
ustawiłem toconstraints
, czego oczekiwałem wcześniej.źródło
Miałem ten sam problem podczas przechodzenia do Xcode 9 i znalazłem podejście, które jest przydatne w przypadku niektórych rodzajów układów. W moim przypadku chciałem mieć nagłówek tabeli, w którym dwie kolumny (etykiety UIL) miały stałą szerokość, a druga zmienną. Niezależnie od tego, jak określiłem szerokości kolumn (w tym używając ograniczeń większych lub równych zamiast równych itp.), Ciągle otrzymywałem ostrzeżenie o możliwym przycięciu. W moim przypadku chciałem, aby kolumna o zmiennej szerokości (UILabel) została przycięta, jeśli to konieczne. Mogłem po prostu zignorować ostrzeżenie, ale nie lubię tego robić.
Podejście, które tutaj zadziałało, polegało na utworzeniu UIView z odpowiednimi ograniczeniami rozmiaru i osadzeniu UILabel jako widoku podrzędnego w UIView. W razie potrzeby następuje obcięcie i nie otrzymuję żadnego ostrzeżenia. Działa to niezależnie od tego, czy UIView / osadzony UILabel znajduje się w StackView, czy nie.
Jest to zasadniczo to samo podejście, co podejście Haroldo Gondima, ale tutaj widać, że działa również z lub bez StackView.
Poniższy obraz przedstawia podejście z i bez StackView. „SpacerName” to element UIView o zmiennej szerokości, zawierający etykietę, a „SpacerPD” to element o stałej szerokości 80. [Kolory nie są istotne; tylko po to, aby pokazać, gdzie są widoki.]
źródło
Jak widać na poniższym obrazku, wystąpił błąd „Ograniczenia stałej szerokości mogą powodować przycinanie”, ponieważ mimo że ustawiłem moje pole tekstowe na środku w pionie, a moja etykieta miała ograniczenie lewego marginesu, nie zdefiniowałem ograniczenia dla pola tekstowego w stosunku do etykiety, więc XCode ostrzegał mnie, że pole tekstowe może przyciąć (być renderowane powyżej) etykietę.
Po dodaniu lewego ograniczenia do pola tekstowego, aby zawsze pozostawać w pewnej odległości od etykiety, błąd został uznany za rozwiązany przez XCode i nie przeszkadzało mi to już ostrzeżeniem o ograniczeniach.
źródło
Miałem podobny problem, gdy próbowałem mieć przycisk z takimi samymi obiciami od krawędzi superwidoku.
Skończyło się na użyciu
horizontal center
ograniczenia iequal widths
ograniczenia dosuper view
.źródło
Aby naprawić błąd : Ograniczenia stałej szerokości mogą powodować przycinanie ”i inną lokalizację. Musisz wybrać widok / obiekt, przejść do„ Show Size Inspector ”, znaleźć ograniczenie szerokości i ustawić stałą na większą lub równą:
Aby naprawić błąd : brak ograniczenia wiodącego / końcowego, co może powodować nakładanie się na inne widoki
Oznacza to, że widok / obiekt, na który skarży się Xcode, nie zawiera wiodącego lub końcowego ograniczenia do sąsiedniego widoku.
Przytrzymując kontrolę, przeciągnij do widoku / obiektu w pobliżu
Dodaj wiodące lub końcowe ograniczenie
źródło