Xcode 6 ma nową funkcję, w której czcionki i rozmiary czcionek są w UILabel
, UITextField
i UIButton
mogą być ustawiane automatycznie na podstawie klasy rozmiaru bieżącej konfiguracji urządzenia, bezpośrednio w serii ujęć. Na przykład możesz ustawić UILabel
czcionkę w rozmiarze 12 w konfiguracjach o dowolnej szerokości i niewielkiej wysokości (np. Na iPhone'ach w orientacji poziomej), a rozmiar 18 na konfiguracjach o zwykłej szerokości i wysokości (np. Na iPadach ). Więcej informacji można znaleźć tutaj:
developer.apple.com/size_class
W teorii jest to świetna funkcja, ponieważ może sprawić, że nie będzie konieczne programowe ustawianie różnych czcionek w funkcjach interfejsu użytkownika na podstawie konfiguracji urządzenia. W tej chwili mam kod warunkowy, który ustawia czcionki na podstawie typu urządzenia, ale oczywiście oznacza to, że muszę ustawić czcionki programowo w całej aplikacji. Więc początkowo byłem bardzo podekscytowany tą funkcją, ale odkryłem, że ma ona poważny problem z rzeczywistym użyciem (być może błąd). Zwróć uwagę, że tworzę w oparciu o SDK 8 i ustawiam minimalny cel wdrożenia iOS 8 , więc nie ma to nic wspólnego ze zgodnością ze starymi wersjami iOS.
Problem jest następujący: jeśli ustawię różne rozmiary czcionek dla różnych klas wielkości i użyję czcionki „systemowej” dostarczonej przez iOS , wszystko działa zgodnie z oczekiwaniami, a rozmiary czcionek zmieniają się w zależności od klasy rozmiaru. Jeśli używam niestandardowej czcionki dostarczonej przez moją aplikację (tak, mam ją poprawnie skonfigurowaną w moim pakiecie aplikacji, ponieważ działa programowo) i ustawię niestandardową czcionkę na etykiecie w scenorysie XCode 6 , która również działa zgodnie z oczekiwaniami. Ale kiedy próbuję użyć różnych rozmiarów niestandardowej czcionki dla różnych klas rozmiarów, w scenorysie nagle nie działa. Jedyną różnicą w konfiguracji jest wybrana przeze mnie czcionka (niestandardowa w porównaniu z czcionką systemową). Zamiast tego wszystkie czcionki pojawiają się w plikuurządzenie i symulator jako domyślna czcionka systemowa w domyślnym rozmiarze , niezależnie od klasy rozmiaru (i sprawdziłem za pomocą debugera, że zastępuje czcionkę systemową rzeczywistą określoną w scenorysie). Zasadniczo funkcja klasy rozmiaru wydaje się być zepsuta dla niestandardowych czcionek. Co ciekawe, niestandardowe czcionki faktycznie wyświetlają się i odpowiednio dostosowują rozmiar w okienku „Podgląd” XCode 6 dla kontrolera widoku: przestaje działać tylko wtedy, gdy działa na rzeczywistym systemie iOS (co sprawia, że myślę, że konfiguruję go poprawnie) .
Wypróbowałem wiele różnych czcionek niestandardowych i wydaje się, że nie działa dla żadnej z nich, ale zawsze działa, jeśli zamiast tego używam „System”.
W każdym razie, czy ktoś inny widział ten problem w Xcode 6 ?
Wszelkie pomysły, czy to błąd w iOS 8, Xcode, czy coś
Robię źle?
Jedynym rozwiązaniem, jakie znalazłem, jak powiedziałem, jest dalsze programowe ustawianie czcionek, tak jak w przypadku około trzech wersji iOS, ponieważ to działa.
Ale chciałbym móc korzystać z tej funkcji, gdybym mógł zmusić ją do pracy z niestandardowymi czcionkami. Korzystanie z czcionki systemowej jest niedopuszczalne w naszym projekcie.
DODATKOWE INFORMACJE: Od Xcode 8.0 błąd został naprawiony.
źródło
Odpowiedzi:
Szybka naprawa:
1) Ustaw czcionki jako system dla klas wielkości
2) Podklasa UILabel i nadpisanie metody „layoutSubviews”, na przykład:
Nawiasem mówiąc, jest to bardzo wygodna technika w przypadku ikonicznych czcionek
źródło
self.label.font = ...
ten sposób możesz używać różnych czcionek w różnych miejscach.Po wypróbowaniu wszystkiego ostatecznie zdecydowałem się na kombinację powyższych rozwiązań. Korzystanie z Xcode 7.2, Swift 2.
@IBInspectable
pozwala ustawić rozmiar czcionki w StoryboarddidSet
obserwatora, aby uniknąć pułapeklayoutSubviews()
(nieskończona pętla dla dynamicznych wysokości wierszy widoku tabeli) iawakeFromNib()
(patrz komentarz @ cocoaNoob)@IBDesignable
@IBDesignable
nie działatraitCollection
zgodnie z tym innym artykułem na stosieUIScreen.mainScreen()
raczejself
na tym artykule stosu niż na tym artykuleźródło
Obejście dla
UILabel
: zachować ten sam rozmiar czcionki na wszystkich klas wielkości, ale zamiast zmienić wysokość etykiety odpowiednio w każdej wielkości klasy. Twoja etykieta musi mieć włączoną funkcję automatycznego zmniejszania. W moim przypadku działało ładnie.źródło
adjustsFontSizeToFitWidth
wydaje się działać tylko dla szerokości (której nie mogę użyć, ponieważ tekst etykiet jest dynamiczny).Ten (i inne związane z Xcode-Size Classes) błąd spowodował ostatnio poważny smutek, ponieważ musiałem przejść przez ogromny plik storyboardu, hakując rzeczy.
Dla każdego innego na tym stanowisku chciałbym dodać coś do odpowiedzi @ razor28, aby złagodzić ból.
W pliku nagłówkowym niestandardowej podklasy użyj
IBInspectable
dla atrybutów środowiska wykonawczego. Dzięki temu te atrybuty będą dostępne z „Inspektora atrybutów”, wizualnie tuż nad domyślną pozycją ustawień czcionek.Przykładowe zastosowanie:
W ten sposób uzyskasz bardzo pomocne wyniki:
Dodatkową korzyścią jest to, że teraz nie musimy ręcznie dodawać atrybutów środowiska wykonawczego dla każdej etykiety. Jest to najbliższe osiągnięcie zamierzonego zachowania XCode. Miejmy nadzieję, że tego lata nadejdzie właściwa poprawka w iOS 9.
źródło
Rozwiązanie podobne do @ razor28, ale myślę, że jest trochę bardziej uniwersalne. Działa również dobrze na starszych wersjach iOS
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
źródło
Błąd jest nadal aktualny w XCode 7.0 GM.
Rozwiązanie Razor28 powoduje w niektórych przypadkach nieskończone pętle. Moje doświadczenie polega na używaniu go w połączeniu z SwipeView .
Zamiast tego proponuję:
1) Podklasa UILabel i przesłonięcie setFont:
2) Ustaw niestandardową klasę swoich etykiet UIL, a następnie ustaw klasy rozmiaru czcionki za pomocą czcionki systemowej
źródło
Nadal występuje problem polegający na tym, że nie można użyć funkcji do ustawiania czcionek dla różnych klas wielkości z poziomu konstruktora interfejsu.
Po prostu ustaw czcionkę w zależności od urządzenia, które chcesz, tak jak poniżej:
Działa to doskonale na wszystkich urządzeniach.
źródło
Żaden z nich nie działał dla mnie, ale tak się stało. Musisz także użyć czcionki systemowej w IB
źródło
Wciąż nie ma podpisanej prawidłowej odpowiedzi. Ten kod działa dobrze dla mnie. Najpierw musisz wyłączyć rozmiar czcionki dla klas rozmiaru w narzędziu do tworzenia interfejsu. W IB możesz używać niestandardowej czcionki.
źródło
Pomocne było połączenie niektórych z późniejszych odpowiedzi powyżej. Oto jak rozwiązałem błąd IB za pomocą rozszerzenia Swift UILabel:
źródło
Używam Swift, XCode 6.4. Więc to właśnie zrobiłem
Idź do Projektanta -> Inspektor tożsamości -> Ustaw klasę na ExUILabel
Następnie przejdź do Inspektora atrybutów w projektancie i ustaw nazwę czcionki.
źródło
Wymyśliłem jeszcze szybszą poprawkę (zakładam, że zawsze używasz jednej niestandardowej czcionki).
Utwórz kategorię dla UILabel i dołącz do plików za pomocą błędnego storyboardu z klasami rozmiarów i dedykowanym ustawieniem czcionki dla różnych klas:
Po prostu użyj niestandardowych czcionek w serii ujęć. Gdy błędny interpreter użyje czcionki systemowej zamiast Twojej własnej, ta kategoria przełączy ją na czcionkę niestandardową.
źródło
Miałem ten sam problem i znalazłem jeden nie do końca jasny, ale dobre rozwiązanie!
źródło
źródło