Xcode 6 tem um novo recurso onde fontes e tamanhos de fonte em UILabel
,UITextField
e UIButton
pode ser definido automaticamente com base na classe de tamanho da configuração do dispositivo atual, mesmo no storyboard. Por exemplo, você pode definir a UILabel
para usar o tamanho de fonte 12 em configurações de "qualquer largura, altura compacta" (como em iPhones em paisagem) e o tamanho 18 em configurações de "largura regular, altura regular" (como em iPads ). Mais informações estão disponíveis aqui:
developer.apple.com/size_class
Este é um ótimo recurso em teoria porque pode tornar desnecessário definir fontes diferentes programaticamente em recursos de IU com base na configuração do dispositivo. No momento, tenho um código condicional que define as fontes com base no tipo de dispositivo, mas, obviamente, isso significa que tenho que definir as fontes de forma programática em todo o aplicativo. Eu estava inicialmente muito animado com esse recurso, mas descobri que ele tem um grave problema de uso real para mim (talvez um bug). Observe que estou construindo com base no SDK 8 e definindo um destino mínimo de implantação do iOS 8 , portanto, isso não tem nada a ver com a compatibilidade com versões antigas do iOS.
O problema é o seguinte: Se eu definir tamanhos de fonte diferentes para classes de tamanho diferentes e usar a fonte "Sistema" fornecida pelo iOS , tudo funcionará conforme o esperado e os tamanhos de fonte mudam com base na classe de tamanho. Se eu usar uma fonte personalizada fornecida pelo meu aplicativo (sim, eu a configurei corretamente no pacote do meu aplicativo, pois funciona de forma programática) e definir a fonte personalizada para um rótulo em um storyboard XCode 6 , que também funciona conforme o esperado. Mas quando tento usar tamanhos diferentes de fonte personalizada para classes de tamanhos diferentes, no storyboard, de repente não funciona. A única diferença na configuração é a fonte que escolhi (uma fonte personalizada versus a fonte do sistema). Em vez disso, todas as fontes aparecem nodispositivo e simulador como a fonte padrão do sistema no tamanho padrão , independentemente da classe de tamanho (e eu verifiquei por meio do depurador que ele está substituindo a fonte do sistema pela real especificada no storyboard). Então, basicamente, o recurso de classe de tamanho parece estar quebrado para fontes personalizadas. Além disso, curiosamente, as fontes personalizadas realmente exibem e ajustam o tamanho corretamente no painel "Visualização" do XCode 6 para o controlador de visualização: ele para de funcionar apenas quando executado no sistema iOS real (o que me faz pensar que estou configurando corretamente) .
Tentei várias fontes personalizadas diferentes e não parece funcionar com nenhuma delas, mas sempre funciona se eu usar "Sistema".
Enfim, mais alguém viu esse problema no Xcode 6 ?
Alguma ideia se isso é um bug no iOS 8, Xcode ou algo assim
Eu estou fazendo errado?
A única solução que encontrei, como disse, é continuar a definir as fontes de maneira programática, como fiz em cerca de três versões do iOS, porque isso funciona.
Mas eu adoraria poder usar esse recurso se pudesse fazê-lo funcionar com fontes personalizadas. Usar a fonte System não é aceitável para nosso design.
INFORMAÇÕES ADICIONAIS: a partir do Xcode 8.0, o bug foi corrigido.
fonte
Respostas:
Correção rápida:
1) Defina as fontes como sistema para classes de tamanho
2) Subclasse UILabel e substitua o método "layoutSubviews" como:
A propósito, é uma técnica muito conveniente para fontes icônicas
fonte
self.label.font = ...
Desta forma, você pode usar fontes diferentes em lugares diferentes.Depois de tentar de tudo, acabei optando por uma combinação das soluções acima. Usando o Xcode 7.2, Swift 2.
@IBInspectable
permite definir o tamanho da fonte no StoryboarddidSet
observador, para evitar as armadilhas delayoutSubviews()
(loop infinito para alturas de linha de visualização de tabela dinâmica) eawakeFromNib()
(veja o comentário de @cocoaNoob)@IBDesignable
@IBDesignable
não funciona detraitCollection
acordo com este outro artigo de pilhaUIScreen.mainScreen()
vez deself
por este artigo de pilhafonte
Solução alternativa para
UILabel
: mantenha o mesmo tamanho de fonte em todas as classes de tamanho, mas altere a altura da etiqueta de acordo com cada classe de tamanho. Seu rótulo deve ter autoshrink ativado. Funcionou bem no meu caso.fonte
adjustsFontSizeToFitWidth
parece funcionar apenas para largura (que não posso usar porque o texto dos rótulos é dinâmico).Este bug (e outros Xcode-Size Classes relacionados) me causou sérios problemas recentemente, pois eu tive que passar por um enorme arquivo de storyboard invadindo coisas.
Para qualquer outra pessoa nesta posição, eu gostaria de acrescentar algo na resposta de @ razor28 para aliviar a dor.
No arquivo de cabeçalho de sua subclasse customizada, use
IBInspectable
para seus atributos de tempo de execução. Isso tornará esses atributos acessíveis no "Attributes Inspector", visualmente logo acima da posição padrão para as configurações de fonte.Exemplo de uso:
Isso produzirá muito útil esta saída:
Um benefício adicional é que agora não precisamos adicionar os atributos de tempo de execução manualmente para cada rótulo. Este é o mais próximo que eu pude chegar do comportamento pretendido do XCode. Esperançosamente, uma correção adequada está a caminho com o iOS 9 neste verão.
fonte
Solução semelhante à de @ razor28, mas acho um pouco mais universal. Além disso, funciona bem em versões mais antigas do iOS
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
fonte
O bug ainda é válido no XCode 7.0 GM.
A solução do Razor28 causa loops infinitos em alguns casos. Minha experiência tem sido usá-lo em conjunto com o SwipeView .
Em vez disso, sugiro que você:
1) Subclasse UILabel e substitua setFont:
2) Defina a classe personalizada de seus UILabels e, em seguida, defina as classes de tamanho da fonte usando a fonte do sistema
fonte
O problema ainda é que você não pode usar o recurso para definir fontes para classes de tamanho diferentes do construtor de interface.
Basta definir a fonte com base no dispositivo que você deseja, como a seguir:
Isso funciona perfeitamente em todos os dispositivos.
fonte
Nada disso funcionou para mim, mas isso funcionou. Você também precisa usar a fonte do sistema em IB
fonte
Ainda sem resposta certa assinada. Este código funciona bem para mim. Você deve desativar o tamanho da fonte para as classes de tamanho no construtor de interface primeiro. No IB você pode usar uma fonte personalizada.
fonte
Uma combinação de algumas das respostas posteriores acima foi útil. Veja como resolvi o bug do IB por meio de uma extensão Swift UILabel:
fonte
Estou usando Swift, XCode 6.4. Então foi isso que eu fiz
Vá para Designer -> Inspetor de identidade -> Defina a classe como ExUILabel
Em seguida, vá para o inspetor de atributos no designer e defina o nome da fonte.
fonte
Eu vim com uma correção ainda mais rápida (presumo que você sempre use sua única fonte personalizada).
Crie uma categoria para UILabel e inclua em arquivos usando storyboard com bugs com classes de tamanho e configuração de fonte dedicada para várias classes:
Basta usar suas fontes personalizadas no storyboard. Quando o intérprete com erros usará a fonte do sistema em vez da sua própria, esta categoria a mudará para sua fonte personalizada.
fonte
Eu tive o mesmo problema e encontrei uma solução não muito clara, mas boa!
fonte
fonte