Gostaria de inserir o texto de a UITextField
.
Isso é possível?
ios
cocoa-touch
uitextfield
RunLoop
fonte
fonte
Respostas:
A substituição
-textRectForBounds:
alterará apenas a inserção do texto do espaço reservado. Para alterar a inserção do texto editável, você também precisa substituir-editingRectForBounds:
fonte
UITextField
residir em aUIScrollView
.- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
Encontrado aqui: stackoverflow.com/questions/5361369/...Consegui fazer isso através de:
É claro que lembre-se de importar o QuartzCore e também adicionar o Framework ao seu projeto.
fonte
UITextField
sobrepõe o conteúdo no lado direito.Se você precisar de apenas uma margem esquerda, pode tentar o seguinte:
Funciona para mim. Espero que isso possa ajudar.
fonte
leftView.backgroundColor = textField.backgroundColor;
... Fora isso ótima solução ... Obrigado (:Em uma classe derivada de UITextField, substitua pelo menos esses dois métodos:
Pode ser tão simples assim se você não tiver conteúdo adicional:
O UITextField fornece vários métodos de posicionamento que você pode substituir.
fonte
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Como cerca de um
@IBInspectable
,@IBDesignable
classe rápida.Você verá isso no seu storyboard.
Atualização - Swift 3
fonte
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/editingRect
) afeta o desempenho da rolagem (pelo menos no iOS 12), quando o texto excede o retângulo visível. Com uma inserção de 15, até pára de rolar.Se você tiver um botão claro, a resposta aceita não funcionará para você. Também devemos nos prevenir contra a Apple de mudar as coisas no futuro, chamando
super
.Portanto, para garantir que o texto não se sobreponha ao botão Limpar, vamos obter o valor 'padrão' em
super
e ajustar conforme necessário.Este código adicionará inserções de 10px na parte superior, esquerda e inferior do campo de texto:
Nota: UIEdgeInsetsMake aceita parâmetros na ordem: superior , esquerda , inferior , direita .
fonte
textRectForBounds:
eeditingRectForBounds:
métodos semclearButtonRectForBounds:
no iOS 7 ou superior funcionou para mim.clearButtonRectForBounds:
apenas ajuda a empurrar um pouco o botão Limpar para a esquerda. Você pode deixar de fora. Meu campo de texto estava em um fundo escuro e o botão Limpar precisava de um pouco de preenchimento extra à direita.Pensei em fornecer uma solução rápida
Swift 3+
fonte
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
, o espaço reservado também será afetado - portanto, adicionar a substituição do espaço reservado fará com que o espaço reservado seja mais 10pt. Se é isso que você está procurando, 👍🏼, mas se não, é bom estar ciente.Usar
textRectForBounds:
é a abordagem correta. Eu envolvi isso na minha subclasse para que você possa simplesmente usartextEdgeInsets
. Veja SSTextField .fonte
Rápido
fonte
Para as pessoas que estão procurando uma solução mais fácil.
Adicione o
UITextField
interior aUIView
. Para simular uma inserção ao redor do campo de texto, mantenho 10 px restantes e a largura é 20px menor que a visualização. Para uma borda de canto arredondado ao redor do campo de texto, use a borda da exibiçãofonte
UITextView
talvez?Você pode definir a inserção de texto para UITextField, definindo o leftView.
Como isso:
fonte
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
Rápido
fonte
Uma boa abordagem para adicionar preenchimento ao UITextField é subclassificar o UITextField e adicionar uma propriedade edgeInsets. Você define o edgeInsets e o UITextField será desenhado de acordo. Isso também funcionará corretamente com um conjunto leftView ou rightView personalizado.
OSTextField.h
OSTextField.m
fonte
Swift 3 / Designável no construtor de interfaces / Insetos horizontais e verticais separados / utilizável fora da caixa
uso:
&
fonte
Fiz isso no IB, onde criei um UIView Behind the textView que foi um pouco mais longo. Com a cor de fundo do campo de texto definida como clara.
fonte
É a maneira mais rápida que encontrei sem fazer nenhuma subclasse:
Em Swift:
fonte
Aqui está o mesmo UITextField subclasse escrito em Swift 3. É bem diferente das versões anteriores do Swift, como você verá:
Aliás, você também pode fazer algo como o seguinte, se quiser controlar a inserção de apenas um lado. Este exemplo específico de ajustar apenas a inserção esquerda é útil se você colocar uma imagem em cima do UITextField, mas desejar que ela pareça ao usuário estar dentro do campo de texto:
fonte
Versão Swift 4.2 :
fonte
Você pode ajustar o posicionamento do texto em um campo de texto, tornando-o uma subclasse
UITextField
e substituindo o-textRectForBounds:
método.fonte
É um absurdo você ter que subclassificar, pois
UITextField
já implementa os métodos, como aponta @Adam Waite. Aqui está uma extensão rápida que expõe um método de fábrica, também disponível em nosso repositório de categorias :fonte
Subcloquei o UITextField para lidar com isso que suporta inserção esquerda, superior, direita e inferior e também o posicionamento claro dos botões.
MRDInsetTextField.h
MRDInsetTextField.m
Exemplo de uso em que * _someTextField * vem da visualização de ponta / storyboard com a classe personalizada MRDInsetTextField
fonte
Isso não é tão curto quanto os outros exemplos, mas adota uma abordagem totalmente diferente para resolver esse problema. Observe que o cursor ainda começará a nivelar para a borda esquerda, mas o texto será recuado adequadamente quando digitado / exibido. Isso funciona sem subclassificar se você está procurando apenas uma margem esquerda e você já está usando
UITextFieldDelegate
seus campos de texto. Você precisa definir os atributos de texto padrão e os atributos de digitação. Você define os atributos de texto padrão ao criar o campo de texto. Os atributos de digitação que você precisa definir no delegado. Se você também estiver usando um espaço reservado, também será necessário definir a mesma margem. Juntando tudo, você obtém algo parecido com isto.Primeiro, crie uma categoria na
UITextField
classe.Em seguida, se você estiver usando suportes posicionados, certifique-se de usar um espaço reservado atribuído configurando o mesmo recuo. Crie um dicionário atribuído padrão com os atributos adequados, algo como isto:
Em seguida, importe a categoria acima e sempre que criar um campo de texto, defina o recuo padrão, o delegado e use os atributos de espaço reservado padrão definidos acima. Por exemplo:
Por fim, no delegado, implemente o
textFieldDidBeginEditing
método, algo como isto:fonte
defaultTextAttributes
contémNSMutableParagraphStyle
é bastante perigosa. Prefiro que seja mutável. Copie tudo isso.Eu normalmente tento evitar subclasses, mas isso funciona se você já tiver:
fonte
Para lançar outra solução que não precisa de subclassificação:
Testado com iOS 7 e iOS 8. Ambos funcionando. Ainda assim, pode haver a chance de a Apple modificar a hierarquia de camadas do UITextField, estragando muito as coisas.
fonte
Aqui está uma resposta abrangente do Swift que inclui um leftView (ícone personalizado) e um botão de limpeza personalizado, ambos configurados no Interface Builder com inserções personalizáveis.
fonte
Uma solução que realmente funciona e abrange todos os casos:
offsetBy
nãoinsetBy
.Rect
.Amostra:
fonte
Se você deseja alterar apenas o recuo SUPERIOR e ESQUERDO,
// posição do marcador
// posição do texto
fonte
Solução rápida sem subclasse e também inspecionável
fonte