Eu tenho um UILabel
onde eu quero adicionar espaço na parte superior e na parte inferior. Com uma altura mínima na restrição, eu a modifiquei para:
EDIT: Para fazer isso eu usei:
override func drawTextInRect(rect: CGRect) {
var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
Mas tenho que encontrar um método diferente, porque se eu escrever mais de duas linhas, o problema é o mesmo:
Respostas:
Se você deseja manter o UILabel, sem subclassificá-lo, o Mundi oferece uma solução clara.
Se, alternativamente, você estiver disposto a evitar agrupar o UILabel com um UIView, poderá usar o UITextView para habilitar o uso de UIEdgeInsets (preenchimento) ou da subclasse UILabel para oferecer suporte ao UIEdgeInsets.
O uso de um UITextView precisaria fornecer apenas as inserções (OBJ-C):
Como alternativa, se você subclassificar UILabel , um exemplo dessa abordagem seria substituir o método drawTextInRect
(OBJ-C)
Além disso, você pode fornecer ao seu novo UILabel subclassificado variáveis de inserção para TOP, LEFT, BOTTOM e RIGHT.
Um exemplo de código pode ser:
Em .h (OBJ-C)
Em .m (OBJ-C)
EDIT # 1:
Pelo que vi, parece que você deve substituir o intrinsicContentSize do UILabel ao subclassificá-lo.
Portanto, você deve substituir o intrinsicContentSize como:
E adicione o seguinte método para editar suas inserções, em vez de editá-las individualmente:
Ele atualizará o tamanho do seu UILabel para coincidir com as inserções de borda e cobrir a necessidade de múltiplas linhas a que você se referiu.
Editar # 2
Depois de pesquisar um pouco, encontrei este Gist com um IPInsetLabel. Se nenhuma dessas soluções funcionar, você pode testá-lo.
Editar # 3
Havia uma pergunta semelhante (duplicada) sobre esse assunto.
Para obter uma lista completa de soluções disponíveis, consulte esta resposta: UILabel margem de texto
fonte
Eu tentei com ele no Swift 4.2 , espero que funcione para você!
Ou você pode usar o CocoaPods aqui https://github.com/levantAJ/PaddingLabel
pod 'PaddingLabel', '1.2'
fonte
min
Swift 3
fonte
Você pode fazer isso corretamente no IB:
fonte
SWIFT 4
Solução fácil de usar, disponível para todos os filhos UILabel no projeto.
Exemplo:
Extensão UILabel
fonte
Basta usar a
UIView
como uma visão geral e definir uma margem fixa para o rótulo com layout automático.fonte
drawTextInRect
funciona apenas para 1 linha,intrinsicContentSize
não funciona com preenchimento horizontal. Envoltório UILabel dentro UIView é o bom caminho a percorrerBasta usar um UIButton, que já está incorporado. Desative todos os recursos extras do botão e você terá uma etiqueta na qual você pode definir instets de borda.
fonte
isUserInteractionEnabled = false
é útil para desativá-lo.Sem Storyboard:
Uso:
Resultado:
fonte
Preenchendo uma
UILabel
solução completa. Atualizado para 2020.Acontece que há três coisas que devem ser feitas.
1. Deve chamar textRect # forBounds com o novo tamanho menor
2. Deve substituir drawText pelo novo tamanho menor
3. Se uma célula de tamanho dinâmico, deve ajustar o intrinsicContentSize
No exemplo típico abaixo, a unidade de texto está em uma exibição de tabela, exibição de pilha ou construção semelhante, o que fornece uma largura fixa . No exemplo, queremos preenchimento de 60,20,20,24.
Assim, pegamos o intrinsicContentSize "existente" e adicionamos 80 à altura .
Repetir ...
Acho esse processo confuso, mas é assim que funciona. Para mim, a Apple deve expor uma chamada chamada algo como "cálculo preliminar da altura".
Em segundo lugar, precisamos usar a chamada textRect # forBounds com nosso novo tamanho menor .
Assim, em textRect # forBounds, primeiro reduzimos o tamanho e depois chamamos super.
Alerta! Você deve ligar super depois , não antes!
Se você investigar cuidadosamente todas as tentativas e discussões nesta página, esse é o problema exato. Observe que algumas soluções "parecem quase funcionar", mas alguém relatará que, em determinadas situações, não funcionará. Esta é realmente a razão exata - confusamente você deve "ligar super depois", não antes.
Portanto, se você chama super-"na ordem errada", geralmente funciona, mas não para determinados comprimentos de texto específicos .
Aqui está um exemplo visual exato de "incorretamente fazendo super primeiro":
Observe que as margens 60,20,20,24 estão corretas, MAS o cálculo do tamanho está realmente errado, porque foi feito com o padrão "super first" no textRect # forBounds.
Fixo:
Observe que somente agora o mecanismo textRect # forBounds sabe como fazer o cálculo corretamente :
Finalmente!
Novamente, neste exemplo, o UILabel está sendo usado na situação típica em que a largura é fixa. Assim, em intrinsicContentSize, precisamos "adicionar" a altura extra geral que queremos. (Você não precisa "adicionar" de forma alguma à largura, isso não faria sentido, pois é fixo.)
Então, no textRect # forBounds, você obtém os limites "sugeridos até agora" pelo autolayout, subtrai suas margens e só então chama novamente para o mecanismo textRect # forBounds, ou seja, em super, o que fornecerá um resultado.
Por fim e simplesmente no drawText, é claro que você desenha na mesma caixa menor.
Ufa!
De novo. Observe que as respostas neste e em outro controle de qualidade "quase" correto sofrem com o problema na primeira imagem acima - o "super está no lugar errado" . Você deve forçar o tamanho maior em intrinsicContentSize e, em seguida, em textRect # forBounds, deve reduzir primeiro os limites da primeira sugestão e, em seguida, chame super.
Resumo: você deve "chamar super last " em textRect # forBounds
Esse é o segredo.
Observe que você não precisa e não deve chamar adicionalmente invalidar, sizeThatFits, needsLayout ou qualquer outra chamada forçada. Uma solução correta deve funcionar corretamente no ciclo normal de extração do autolayout.
Dica:
Se você estiver trabalhando com fontes monoespaçadas, aqui está uma ótima dica: https://stackoverflow.com/a/59813420/294884
fonte
Swift 4+
uso:
fonte
Código Swift 3 com exemplo de implementação
Não se esqueça de adicionar o nome da classe UIMarginLabel no objeto de rótulo do storyboard. Feliz codificação!
fonte
Conforme Swift 4.2 (Xcode 10 beta 6), "UIEdgeInsetsInsetRect" está sendo descontinuado. Também declarei a classe pública para torná-la mais útil.
fonte
sizeToFit()
deve ser público como: "O método de instância de substituição deve ser tão acessível quanto seu tipo deEditei um pouco na resposta aceita. Há um problema quando,
leftInset
erightInset
aumente, uma parte do texto desaparecerá, b / c a largura do rótulo será reduzida, mas a altura não aumentará conforme a figura:Para resolver esse problema, é necessário recalcular a altura do texto da seguinte maneira:
e resultado:
Espero ajudar algumas pessoas na mesma situação que eu.
fonte
override func drawTextInRect(rect: CGRect)
tornaoverride func drawText(in rect: CGRect)
-override func intrinsicContentSize() -> CGSize
se e torna - seoverride var intrinsicContentSize : CGSize
Enjoy!override var intrinsicContentSize: CGSize { // .. return intrinsicSuperViewContentSize }
Basta usar o autolayout:
Feito.
fonte
Outra opção sem subclassificação seria:
text
sizeToFit()
aumente um pouco a altura da etiqueta para simular o preenchimento
fonte
label.frame = CGRect( x: label.frame.origin.x - 10, y: label.frame.origin.y - 4, width: label.frame.width + 20,height: label.frame.height + 8)
a -10 e -4 para centralizarSolução Swift 3, iOS10:
fonte
Em Swift 3
maneira melhor e simples
fonte
Subclasse UILabel. (Subclasse Arquivo-Novo-Arquivo-CocoaTouchClass-make do UILabel).
No ViewController:
OU Associe a classe UILabel personalizada no Storyboard como a classe do Label.
fonte
Assim como outras respostas, mas corrija um erro. Quando
label.width
é controlado pelo layout automático, às vezes o texto é cortado.fonte
Preenchimento fácil (Swift 3.0, resposta de Alvin George):
fonte
Uma elaboração da resposta de Mundi.
ou seja, incorporar uma etiqueta em
UIView
e aplicar o preenchimento por meio do Layout automático. Exemplo:Visão geral:
1) Crie um
UIView
("painel") e defina sua aparência.2) Crie um
UILabel
e adicione-o ao painel.3) Adicione restrições para aplicar o preenchimento.
4) Adicione o painel à sua hierarquia de visualizações e posicione o painel.
Detalhes:
1) Crie a vista do painel.
2) Crie o rótulo, adicione-o ao painel como uma subvisão.
3) Adicione restrições entre as bordas da etiqueta e o painel. Isso força o painel a manter uma distância da etiqueta. ou seja, "padding"
Editorial: fazer tudo isso manualmente é super-tedioso, detalhado e propenso a erros. Sugiro que você escolha um invólucro de layout automático no github ou escreva um você mesmo
4) Adicione o painel à sua hierarquia de visualizações e adicione restrições de posicionamento. por exemplo, abrace o lado direito de um tableViewCell, como na imagem de exemplo.
Nota: você só precisa adicionar restrições posicionais, e não dimensionais: o Layout automático resolverá o layout com base na
intrinsicContentSize
etiqueta e nas restrições adicionadas anteriormente.fonte
Use este código se estiver enfrentando um problema de corte de texto ao aplicar preenchimento.
fonte
Semelhante a outras respostas, mas com uma classe func para configurar dinamicamente o preenchimento:
fonte
Uma solução pragmática é adicionar etiquetas em branco da mesma altura e cor que a etiqueta principal. Defina o espaço inicial / final como o rótulo principal como zero, alinhe os centros verticais e torne a largura a margem desejada.
fonte
Se você deseja adicionar preenchimento de 2 pixels ao redor do textRect, faça o seguinte:
fonte
Se você não quiser ou precisar usar um @IBInspectable / @IBDesignable UILabel no Storyboard (acho que eles são renderizados muito lentos de qualquer maneira), é mais fácil usar UIEdgeInsets em vez de 4 CGFloats diferentes.
Exemplo de código para o Swift 4.2:
fonte
Objetivo-C
Baseado na resposta do Tai Le lá em cima, que implementa o recurso dentro de um IB Designable, aqui está a versão do Objective-C.
Coloque isso em YourLabel.h
E isso iria em YourLabel.m
Você pode modificar as inserções YourLabel diretamente no Interface Builder após especificar a classe dentro do XIB ou storyboard, o valor padrão das inserções sendo zero.
fonte
Jeito fácil
fonte
Estofamento fácil:
fonte
Swift 4+
fonte