Eu tenho o seguinte código...
UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
... a ideia é que eu posso ter texto com várias linhas para o botão, mas o texto é sempre obscurecido pela backgroundImage do UIButton. Uma chamada de log para mostrar as subvisões do botão mostra que o UILabel foi adicionado, mas o texto em si não pode ser visto. Isso é um bug no UIButton ou estou fazendo algo errado?
ios
cocoa-touch
uibutton
uikit
Owain Hunt
fonte
fonte
button.titleLabel?.numberOfLines = 0
Respostas:
Para iOS 6 e superior, use o seguinte para permitir várias linhas:
Para iOS 5 e abaixo, use o seguinte para permitir várias linhas:
2017, para iOS9 em diante ,
Geralmente, basta fazer estas duas coisas:
fonte
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
NSLineBreakMode
, assim:button.titleLabel?.lineBreakMode = .ByWordWrapping
.A resposta selecionada está correta, mas se você preferir fazer isso no Interface Builder, pode fazer o seguinte:
fonte
titleLabel.textAlignment
comNumber
valor de1
noUser Defined Runtime Attributed
para tornar o texto centradoSe você deseja adicionar um botão com o título centralizado em várias linhas, defina as configurações do Interface Builder para o botão:
[ ]
fonte
Para o IOS 6:
Como
são preteridos no IOS 6 em diante ..
fonte
NSText.h
,Foundation
não há itens obsoletos adicionados. Está disponível a partir do 6.0, mas não obsoleto.button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
Para reafirmar a sugestão de Roger Nolan, mas com código explícito, esta é a solução geral:
fonte
SWIFT 3
fonte
No Xcode 9.3, você pode fazer isso usando o storyboard como abaixo,
Você precisa definir o texto do título do botão
button.titleLabel?.textAlignment = .center
Você não precisa definir o texto do título com a nova linha (\ n), como abaixo,
button.setTitle("Good\nAnswer",for: .normal)
Basta definir o título,
button.setTitle("Good Answer",for: .normal)
Aqui está o resultado,
fonte
myButton.titleLabel.textAlignment = NSTextAlignmentCenter
declaração também é necessária.Existe uma maneira muito mais fácil:
(Editar para iOS 3 e posterior :)
fonte
Alinhar à esquerda no iOS7 com o layout automático:
fonte
Eu tive um problema com o layout automático, depois de ativar várias linhas, o resultado foi o seguinte: portanto, o tamanho não afeta o tamanho do botão que eu adicionei com base (nesse caso, contentEdgeInsets era (10, 10, 10, 10 ) após ligar : espero que ajude você (swift 5.0):
titleLabel
Constraints
contentEdgeInsets
makeMultiLineSupport()
fonte
Primeiro de tudo, você deve estar ciente de que o UIButton já possui um UILabel dentro dele. Você pode configurá-lo usando
–setTitle:forState:
.O problema com o seu exemplo é que você precisa definir a
numberOfLines
propriedade do UILabel para algo diferente do valor padrão de 1. Você também deve revisar alineBreakMode
propriedade.fonte
Para aqueles que estão usando o storyboard do Xcode 4, clique no botão e, no painel Utilitários do lado direito, em Inspetor de Atributos, você verá uma opção para Quebra de Linha. Escolha Quebra de linha, e você deve estar pronto.
fonte
As respostas aqui mostram como obter o título do botão com várias linhas programaticamente.
Eu só queria acrescentar que, se você estiver usando storyboards, poderá digitar [Ctrl + Enter] para forçar uma nova linha no campo de título de um botão.
HTH
fonte
Você precisa adicionar este código:
fonte
Quanto à idéia de Brent de colocar o título UILabel como visão de irmão, não me parece uma idéia muito boa. Eu continuo pensando em problemas de interação com o UILabel devido a seus eventos de toque que não passam pela visão do UIButton.
Por outro lado, com um UILabel como sub-visualização do UIButton, estou bastante confortável sabendo que os eventos de toque sempre serão propagados para a super-visão do UILabel.
Eu segui essa abordagem e não percebi nenhum dos problemas relatados com backgroundImage. Eu adicionei esse código na -titleRectForContentRect: de uma subclasse UIButton, mas o código também pode ser colocado na rotina de desenho da superview UIButton, que nesse caso você deve substituir todas as referências a self pela variável UIButton.
Demorei um pouco e escrevi um pouco mais sobre isso aqui . Lá, também aponto uma solução mais curta, embora ela não se encaixe perfeitamente em todos os cenários e envolva algumas visualizações privadas de hackers. Também é possível baixar uma subclasse UIButton pronta para ser usada.
fonte
Se você usa o layout automático no iOS 6, também pode ser necessário definir a
preferredMaxLayoutWidth
propriedade:fonte
Definir lineBreakMode como NSLineBreakByWordWrapping (no IB ou no código) torna o rótulo do botão multilinha, mas não afeta o quadro do botão.
Se o botão tiver título dinâmico, existe um truque: coloque o UILabel oculto com a mesma fonte e amarre sua altura à altura do botão com layout; quando definir o texto como botão e rotular e o layout automático fará todo o trabalho.
Nota
A altura do tamanho intrínseco do botão de uma linha é maior que a da etiqueta; portanto, para evitar que a altura da etiqueta diminua, é vertical A Prioridade de abraço de conteúdo deve ser maior que a resistência vertical à compressão de conteúdo do botão.
fonte
No Swift 5.0 e no Xcode 10.2
Na sua chamada ViewController como esta
fonte
Swift 5, para texto de várias linhas no UIButton
fonte
Funciona perfeitamente.
Adicione para usar isso com o arquivo de configuração como o Plist, você precisa usar o CDATA para escrever o título com várias linhas, assim:
fonte
Se você usa o layout automático.
fonte
swift 4.0
fonte
Hoje em dia, se você realmente precisa desse tipo de coisa para ser acessível no construtor de interface caso a caso, pode fazê-lo com uma extensão simples como esta:
Em seguida, você pode simplesmente definir numberOfLines como um atributo em qualquer subclasse UIButton ou UIButton como se fosse um rótulo. O mesmo vale para uma série de outros valores geralmente inacessíveis, como o raio do canto da camada de uma vista ou os atributos da sombra que ela lança.
fonte
Role sua própria classe de botão. É de longe a melhor solução a longo prazo. O UIButton e outras classes do UIKit são muito restritivas na maneira como você pode personalizá-las.
fonte
fonte
Incorporei a resposta de jessecurry no STAButton, que faz parte da minha biblioteca de código aberto STAControls . Atualmente, eu o uso em um dos aplicativos que estou desenvolvendo e funciona para minhas necessidades. Fique à vontade para abrir questões sobre como aprimorá-lo ou me enviar solicitações pull.
fonte
Para corrigir o espaçamento do rótulo do título no botão, defina titleEdgeInsets e outras propriedades antes de setTitle:
PS Eu testei a configuração titleLabel? .TextAlignment não é necessário e o título se alinha
.natural
.fonte
Embora seja bom adicionar uma subvisão a um controle, não há garantia de que realmente funcione, porque o controle pode não esperar que esteja lá e, portanto, se comportar mal. Se você conseguir se safar, basta adicionar o rótulo como uma visão irmão do botão e definir seu quadro para que ele se sobreponha ao botão; desde que esteja definido para aparecer na parte superior do botão, nada que ele possa fazer o ocultará.
Em outras palavras:
fonte
addSubview:
aqui o adiciona àbutton
super visão de, tornando-o irmão do botão, para que a correspondência entre os centros esteja correta.