Estou usando um UITextField
com um UIPickerView
para inputView
, para que, quando o usuário tocar no campo de texto, um seletor seja convocado para que ele selecione uma opção.
Quase tudo funciona, mas eu tenho um problema: o cursor ainda pisca no campo de texto quando está ativo, o que é feio e inapropriado, pois o usuário não deve digitar no campo e não recebe um teclado. Eu sei que eu poderia resolver isso hackily definindo editing
para NO
no campo de texto e acompanhando os toques nele, ou substituindo-o por um botão com estilo personalizado e convocando o selecionador por código. No entanto, quero usar os UITextFieldDelegate
métodos para toda a manipulação de eventos no campo de texto e hacks, como substituir o campo de texto por um botão, não permitem essa abordagem.
Como posso simplesmente ocultar o cursor no UITextField
lugar?
fonte
A partir do iOS 7, agora você pode simplesmente definir o
tintColor = [UIColor clearColor]
campo de texto e o cursor desaparecerá.fonte
caretRectForPosition:
solução de substituição.Você pode simplesmente limpar a tonalidade do campo de texto
Swift 3.0
fonte
Você também pode impedir o usuário de selecionar, copiar ou colar qualquer texto, para que a única entrada de texto venha da visualização do seletor.
http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/
fonte
Confira a propriedade
selectedTextRange
do protocoloUITextInput
, ao qual a classeUITextField
está em conformidade. Poucos! Essa é uma lição de programação orientada a objetos.Ocultar sinal de intercalação
Para ocultar o cursor, anule o intervalo de texto selecionado do campo de texto.
Mostrar o sinal de intercalação
Aqui estão duas maneiras de mostrar o sinal de intercalação.
Defina o intervalo de texto selecionado do campo de texto para o final do documento.
Para manter o cursor no mesmo local, primeiro armazene o intervalo de texto selecionado do campo de texto em uma variável de instância.
Em seguida, quando desejar exibir o sinal de intercalação, basta definir o intervalo de texto selecionado do campo de texto de volta ao que era originalmente:
fonte
caretRectForPosition
. É mais explícito o que está fazendo, e os documentos que você citou não deixam claro qual deve ser o comportamento do sinal de intercalação quando não há 'seleção atual'. Se a afirmação de @ ArtGeigel de que isso não funciona estava correta (o que não é, pelo menos até onde eu posso ver), não ficaria claro que isso foi um bug.A resposta fornecida pelo OP foi copiada do corpo da pergunta para ajudar a limpar a cauda cada vez maior das perguntas sem resposta.
Encontrei outra solução: subclasse
UIButton
e substitua esses métodosAgora, o botão, como a
UIResponder
, tem um comportamento semelhanteUITextField
e uma implementação bastante simples.fonte
UITextFieldDelegate
com isso para manipular eventos de edição inicial e final. Em vez disso - a menos que haja uma maneira de lidar com os eventos que eu não conheço - você precisará substituirbecomeFirstResponder
eresignFirstResponder
na subclasse de botão e possivelmente criar seu próprio protocolo de delegado, adicionar umadelegate
propriedade e chamar o delegado do mencionado métodos. Isso é muito mais trabalho do que apenas substituircaretRectForPosition
umaUITextField
subclasse.UIResponder
referência da turma antes e não tinha ideia de que um truque como esse fosse possível.UITextField
ae ocultar o cursor, que é basicamente uma invasão, pois estamos usando o campo de texto como um rótulo enquanto não usando nenhuma das funcionalidades doUITextField
.Versão Swift 5 da publicação de Net
fonte
defina a tintColor para Clear Color
e você também pode definir no construtor de interface
fonte
Se você deseja ocultar o cursor, pode usá-lo facilmente! Funcionou para mim ..
fonte
A resposta fornecida pelo OP foi copiada do corpo da pergunta para ajudar a limpar a cauda cada vez maior das perguntas sem resposta.
Acho que tenho a solução correta, mas se puder ser melhorada será bem-vinda :) Bem, fiz uma subclasse de UITextField e substituí o método que retorna o CGRect para os limites
O problema? O texto não aparece porque o ret é zero. Mas eu adicionei um UILabel como uma sub-visualização do controle e substituí o método setText. Assim, quando inserimos um texto normalmente, o texto do campo de texto é nulo e é o rótulo que mostra o texto
Com isso, a coisa funciona como esperado. Você conhece alguma maneira de melhorá-lo?
fonte
Para desativar o cursor e o menu, uso a subclasse com estes 2 métodos:
fonte
Eu simplesmente subclasse
UITextField
e substituo dalayoutSubviews
seguinte forma:É uma invasão suja e pode falhar no futuro (quando o cursor estiver visível novamente - seu aplicativo não trava), mas funciona.
fonte
Você pode adicionar uma
BOOL cursorless
propriedade aUITextField
uma categoria por meio de objetos associados.Em seguida, use swizzling de método para swizzle
caretRectForPosition:
com um método que alterna entreCGRectZero
e seu valor padrão usandocursorless
.Isso leva a uma interface simples por meio de uma categoria suspensa. Isso é demonstrado nos seguintes arquivos.
Basta soltá-los e obter o benefício dessa interface simples
UITextField
categoria: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless .mMétodo Swizzling: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject% 2BRXRuntimeAdditions.m
fonte