Pergunta

Alguém tem qualquer exemplos ou recursos onde eu poderia encontrar informações sobre a rolagem de texto que é demasiado longo para exibir em um controle de botão? Estou pensando em algo ao longo destas linhas.

  • Tela tanto texto irá caber dentro do rect atual com um '...' no final para significar estouro.
  • Pausa para dizer 1 segundo e depois rolar lentamente o texto para a margem direita exibindo a parte direita da string.
  • Tela tanto texto irá caber dentro do rect atual com um '...' no início para significar estouro.
  • Inicie a coisa toda em sentido inverso.

Existe uma maneira fácil de fazer isso usando o "core" ou construído em estruturas "animação" em um determinado dispositivo móvel?

[editar] Iwanted para adicionar mais alguns detalhes como eu acho que as pessoas estão mais focados em tempo ou não o que eu estou tentando fazer é apropriado. O botão é para as respostas em um jogo de trivia. Ele não executa qualquer função speciffic UI, mas é para exibir a resposta. A própria Apple está fazendo isso em seu jogo de trivia iQuiz sobre o iPod Nano e eu acho que é uma solução muito elegante para respostas que são mais longos do que a largura do meu botão.

No caso seu o '...' que é a parte difícil deste. Vamos dizer que eu removi esse requisito. Eu poderia ter o rótulo para o botão ser de tamanho completo, mas cortada para o rect cliente do botão e usar alguns métodos de animação para deslocá-lo dentro do rect recorte? Isso me daria quase o mesmo efeito menos as elipses.

Foi útil?

Solução

Aqui está uma idéia: em vez de reticências (...), use um gradiente de cada lado, de modo que os fades texto extra distância para a cor de fundo. Em seguida, você poderia fazer isso com três CALayers:. Um para o texto e dois para efeito de fade

As máscaras de fade seria apenas retângulos com um gradiente que vai de transparente para a cor de fundo. Eles devem ser posicionada por cima da camada de texto. O texto será desenhado na camada de texto, e então você só animá-lo deslizar para trás e para frente da maneira que você descreve. Você pode criar um objeto CGPath descrevendo o caminho e adicioná-lo a um objeto CAKeyframeAnimation que você adicionar a camada de texto.

Quanto a saber se você acha que isso é "fácil" depende de quão bem você sabe Core Animation, mas acho que uma vez que você aprender a API que você vai encontrar isso não é muito ruim e seria vale a pena.

Outras dicas

Sem querer ser obtuso, talvez você deve repensar o seu problema. Um botão deve ter uma função clara e previsível. Não é um lugar para armazenar e exibir texto. Talvez você poderia ter uma descrição show na tela com um botão padrão agradável abaixo?

Atualização com exemplo de código fonte:

Aqui estão algumas pronto para usar o código-fonte exemplo (na verdade um projeto Xcode zipado completa com imagem e arquivos nib e algum código fonte), não para o iPhone, não usando core Animation, usando apenas um par de NSImages simples e uma NSImageView. É apenas um truque barato, ele não implementa a funcionalidade completa que você solicitou (desculpe, mas eu não sentir vontade de escrever seu código-fonte para você :-P), layout de código horrível (hey, eu só cortou isso juntos dentro de um par de minutos, então você não pode esperar melhor ;-)) e é apenas uma demonstração de como isso pode ser feito. Isso pode ser feito com o Core Animation, também, mas esta abordagem é mais simples. Compondo o botão de animação em um NSImageView não é tão agradável como subclasse um NSView e pintar diretamente ao seu contexto, mas é muito mais simples (Eu só queria cortar juntos a solução mais simples possível). Ele também não vai rolar para trás, uma vez que rolada todo o caminho para a direita. Porém você só precisa de outro método para rolar para trás e começar outra NSTimer que dispara 2 segundos depois que você desenhou os pontos para a esquerda.

Apenas abrir o projeto no Xcode e hit prazo, isso é tudo o que há para fazer. Então dê uma olhada no código fonte. É realmente não é tão complicado (no entanto, você pode ter que reformatar pela primeira vez, o layout é uma porcaria).


Atualização causa de comentário para a minha resposta:

Se você não usar elementos da Apple UI em tudo, não vejo o problema. Nesse caso o botão não é nem mesmo um botão, é apenas uma exibição clicável (NSView se você usar Cacau). Você pode apenas sub-classe NSView como MyAnswerView e substituir o método de pintura para pintar para a vista o que quiser. Texto de múltiplas linhas, texto de rolagem, texto 3D animado, é completamente até sua imaginação.

Aqui está um exemplo , mostrando como alguém subclasse NSView para criar um controle personalizado completo que não existe por padrão. Os olhares de controle como este:

text alt

Veja o engraçado no canto superior esquerdo? Isso é um controle. Veja como funciona:

text alt


Eu odeio dizer isso, pois não é resposta para sua pergunta, mas " Não faça isso! ". Apple tem diretrizes como implementar uma interface de usuário. Enquanto você está livre para ignorá-los, os usuários da Apple são usados ??para ter UIs Seguindo essas orientações e não seguem deles vai criar aplicações que os usuários da Apple encontrar feio e pouco atraente.

Aqui estão da Apple Human Interface Guidelines

Deixe-me citar há

Conteúdo Empurre botões e Rotulagem

Um botão de pressão sempre contém texto, ele não contém uma imagem. Se você precisar para exibir um ícone ou outra imagem em um botão, usar em vez de um botão de bisel, descrito em “Bevel Botões.”

O rótulo de um botão de pressão deve ser um verbo ou verbo frase que descreve o ação que realiza-Save, Fechar, Imprimir, Excluir, Alterar senha, e assim por diante. E se um botão de pressão atua sobre uma única definindo, rotular o botão como especificamente quanto possível; "Escolher Picture ... “, por exemplo, é mais útil do que “Escolher ...” Porque botões iniciar uma ação imediata, não deve ser necessário o uso de “agora” (Verificar agora, por exemplo) no rótulo.

etiquetas de botão push deve ter capitalização de estilo de título, como descrito em “Capitalização de Interface Element rótulos e texto.” E se o botão abre imediatamente outra janela, de diálogo, ou aplicação para executar sua ação, você pode usar um reticências no rótulo. Por exemplo, preferências do Mail mostra um empurrão botão que inclui uma elipse porque abre sistema .Mac preferências, como se mostra na Figura 15-8.

Buttons deve conter um único verbo ou uma frase verbo, não responde ao jogo de trivia! Se você tem entre 2 e 5 respostas, você deve usar botões de opção para que o usuário selecione a resposta e um botão OK para que o usuário aceitar a resposta. Por mais de 5 respostas, você deve considerar um Pop-up Selector em vez de acordo com as orientações, embora eu acho que seria bastante feio neste caso.

Você poderia considerar o uso de uma tabela com apenas uma coluna, uma linha por resposta e cada célula sendo várias linhas, se a resposta é muito longo e necessidades para quebrar. Assim, o usuário seleciona uma linha da tabela, clicando sobre ela, que destaca a célula da tabela e, em seguida, clica em um botão OK para concluir. Alternativamente, você pode continuar diretamente, assim que o usuário selecionar qualquer célula da tabela (mas de que maneira você levar o usuário qualquer chance de corrigir um clique acidental). Por outro lado, as tabelas com células de várias linhas são bastante raros no MacOS X. O iPhone usa alguns, mas geralmente com muito pouco texto (no máximo duas linhas).

certeza que você não pode fazer isso usando a API padrão, certamente não com UILineBreakMode. Além disso, o guia de estilo diz que reticências indica que o botão, quando pressionado irá pedir-lhe mais informações -por exemplo Open File ... vai pedir o nome de um arquivo. Sua proposta de utilização de reticências viole esta diretriz.

Você precisa de alguma lógica personalizada para implementar o comportamento que você descreve, mas eu não acho que é o caminho para ir de qualquer maneira.

Esta não é uma prática muito boa interface do usuário, mas se você ainda quiser fazê-lo, sua melhor aposta é para fazê-lo através de um div clickable estilo para se parecer com um botão.

Definir a largura da div para um valor explícito, e seu estouro como oculto, em seguida, usar um script execução em um intervalo para ajustar a propriedade scrollLeft deste div.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top