Estou tentando fazer um UIButton
que tenha duas linhas de texto em seu titleLabel. Este é o código que estou usando:
UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
[titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
titleButton.titleLabel.numberOfLines = 2;
[self addSubview:titleButton];
Quando tento fazer isso, o texto só aparece em uma linha. Parece que a única maneira de obter mais de uma linha de texto UIButton.titleLabel
é definir numberOfLines=0
e usar UILineBreakModeWordWrap
. Mas isso não garante que o texto tenha exatamente duas linhas.
Usar uma planície UILabel
, no entanto, funciona:
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[self addSubview:titleLabel];
Alguém sabe fazer o UIButton
trabalho com duas linhas? A única solução é criar um separado UILabel
para conter o texto e adicioná-lo como uma subvisão do botão?
objective-c
ios
uibutton
uilabel
comerciante
fonte
fonte
numberOfLines=0
e usarUILineBreakModeWordWrap
, você pode obter várias linhas. O problema é que pode haver mais de duas linhas se o texto for muito longo. Eu quero exatamente dois solitários com reticências no final da segunda linha (se o texto for muito longo).Respostas:
Resposta atualizada para versões mais recentes do iOS
Como esta é a resposta aceita, adicionou a resposta de @Sean aqui:
Defina essas propriedades no titleLabel do seu botão.
button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0
Swift 3 e 4:
button.titleLabel?.lineBreakMode = .byWordWrapping button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0
Resposta original para uma versão mais antiga do iOS
Se você quiser 2 linhas de texto sobre o seu,
UIButton
deve adicionar umUIlabel
que faça exatamente isso.UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)]; titleLabel.font = [UIFont boldSystemFontOfSize:24.0]; titleLabel.text = @"This text is very long and should get truncated at the end of the second line"; titleLabel.numberOfLines = 2; titleLabel.lineBreakMode = UILineBreakModeTailTruncation; [myButton addSubview:titleLabel]; //add label to button instead.
Atualizado para solução de construtor de interface
Adicionada a resposta de @Borut Tomazin para uma resposta mais completa. Atualizada esta parte novamente já que a resposta de @Borut Tomazin foi melhorada.
Você pode fazer isso muito mais fácil, sem a necessidade de código. Em Interface Builder definido
Line Break
em UIButton paraWord Wrap
. Depois, você pode inserir várias linhas de título. Basta apertar asOption + Return
teclas para fazer uma nova linha. Você também precisará adicioná-lo ao Atributo de tempo de execução definido pelo usuário no Interface Builder:titleLabel.textAlignment Number [1]
fonte
UILineBreakMode
estão obsoletos, use emNSLineBreakMode
vez delesVocê não precisa adicionar um UILabel ao UIButton. São apenas objetos extras e trabalho.
Defina essas propriedades no titleLabel do seu botão.
button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0
Rápido:
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0
fonte
intrinsicContentSize
, que ainda retorna uma altura que corresponde a apenas uma linha de texto. Eu consertei substituindo o botãointrinsicContentSize
onde defini a altura[self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height
.Você pode fazer isso muito mais fácil, sem a necessidade de código. Em Interface Builder definido
Line Break
em UIButton paraWord Wrap
. Depois, você pode inserir várias linhas de título. Basta apertar asOption + Return
teclas para fazer uma nova linha. Você também precisará adicioná-lo ao Atributo de tempo de execução definido pelo usuário no Interface Builder:titleLabel.textAlignment Number [1]
É simples assim. Espero que ajude...
fonte
titleLabel.textAlignment
Atributo de Tempo de Execução Definido pelo Usuário no Construtor de Interface e configurando-o como Número = 1 (valor do NSTextAlignmentCenter).button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; button.titleLabel.textAlignment = NSTextAlignmentCenter; [button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
fonte
NSString
interiorsetTitle
. `WordWrapping`` está fazendo isso por você!Para evitar completamente a necessidade de editar o código e, portanto, a necessidade de criar uma subclasse de sua visualização, no Xcode5 e superior, você pode seguir a sugestão de Borut Tomazin:
e então, nos Atributos de tempo de execução definidos pelo usuário, você pode adicionar
Caminho da chave:
titleLabel.textAlignment
Tipo:
Number
Valor:
1
Observação: isso pode não ser totalmente "à prova de futuro", pois estamos traduzindo a
UITextAlignmentCenter
constante em seu valor numérico (e essa constante pode mudar conforme novas versões do iOS são lançadas), mas parece seguro em um futuro próximo.fonte
Você pode modificar o valor necessário diretamente do Storyboard. Selecione o botão, vá para o inspetor de identidade e adicione o seguinte par de valores-chave na seção "Atributos de tempo de execução definidos pelo usuário":
fonte