UITextView com borda

127

Eu quero ter uma borda cinza fina em torno de a UITextView. Examinei a documentação da Apple, mas não encontrei nenhuma propriedade lá. Por favor ajude.

Todos
fonte

Respostas:

306
#import <QuartzCore/QuartzCore.h>

....

// typically inside of the -(void) viewDidLoad method
self.yourUITextView.layer.borderWidth = 5.0f;
self.yourUITextView.layer.borderColor = [[UIColor grayColor] CGColor];
Kendall Helmstetter Gelner
fonte
62
Não achei que fosse necessário explicar muito, o view é o UITextView e o código vai para onde você configurou o view (awakeFromNib ou viewDidLoad são dois locais possíveis). Como não houve código fornecido, não há como dar um bom contexto em resposta.
Kendall Helmstetter Gelner
O XCode não permite definir borda para a camada. Ele diz que a camada é somente leitura. Eu fiz o UIView (onde coloquei alguns elementos) e tentei colocar a borda nessa view. Tentando fazer isso self.myView.layer.borderWidth ..., mas como eu disse, a camada é somente leitura, então camada não têm quaisquer métodos ou variáveis para definir
Paulius Vindzigelskis
2
Você importou o QuartzCore? Você também pode tentar obter um CALayer de self.myView e definir borderWidth nisso. É configurável.
Kendall Helmstetter Gelner
Alguns mais informações sobre "camada" sendo somente leitura no UIView (a propriedade camada é, mas você pode definir valores na camada para uma visão): stackoverflow.com/questions/12837077/...
Kendall Helmstetter Gelner
42

Adicione o seguinte para cantos arredondados:

self.yourUITextview.layer.cornerRadius = 8; 
user542584
fonte
23

Aqui está o código que usei para adicionar uma borda ao redor do meu TextViewcontrole chamado "tbComments":

self.tbComments.layer.borderColor = [[UIColor grayColor] CGColor];
self.tbComments.layer.borderWidth = 1.0;
self.tbComments.layer.cornerRadius = 8;

E aqui está o que parece:

insira a descrição da imagem aqui

Mole-mole.

Mike Gledhill
fonte
19

Eu adiciono UIImageViewcomo uma subvisualização do UITextView. Isso corresponde à borda nativa em um UITextField, incluindo o gradiente de cima para baixo:

insira a descrição da imagem aqui

textView.backgroundColor = [UIColor clearColor];
UIImageView *borderView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, textView.frame.size.width, textView.frame.size.height)];
borderView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
UIImage *textFieldImage = [[UIImage imageNamed:@"TextField.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 8, 15, 8)];
borderView.image = textFieldImage;
[textField addSubview: borderView];
[textField sendSubviewToBack: borderView];

Estas são as imagens png que eu uso e uma representação jpg:

@ 1x

@ 2x

insira a descrição da imagem aqui

Ben Packard
fonte
Boa solução. Essas imagens são suas? Somos livres para usá-los?
James Webster
Essas imagens são 'modeladas' naquelas usadas nos próprios aplicativos da Apple. Na verdade, eu os extraí e fiz muito poucas mudanças, se houver alguma. Use por sua conta e risco. O objetivo era imitar a aparência nativa, por isso é difícil criar algo que pareça muito diferente. Pelo que vale, enviei e tive aplicativos aprovados usando esta imagem sem problemas.
Ben Packard
Os arquivos de imagem png parecem ter sido removidos - não pretendo atualizá-lo constantemente com um novo local da imagem, portanto peço desculpas se o jpg não funcionar para você. Posso reenviar como e quando solicitado via comentário.
Ben Packard
3
Com a imagem anexada, isso funciona melhor: coderesizableImageWithCapInsets: UIEdgeInsetsMake (28, 14, 28, 14)
RefuX
Os links do WikiUpload (para as duas imagens) não conseguem encontrar os arquivos de imagem agora. ;-(
Mike Gledhill
18

Funciona muito bem, mas a cor deve ser uma CGColor, não UIColor:

view.layer.borderWidth = 5.0f;
view.layer.borderColor = [[UIColor grayColor] CGColor];
Matt Connolly
fonte
4
#import <QuartzCore / QuartzCore.h>
kolinko
6

Eu acredito que as respostas acima são para as versões anteriores do Swift. Pesquisei um pouco no Google e o código abaixo funciona para o Swift 4. Basta compartilhá-lo para quem puder se beneficiar.

self.textViewName.layer.borderColor = UIColor.lightGray.cgColor
self.textViewName.layer.borderWidth = 1.0
self.textViewName.layer.cornerRadius = 8

Feliz codificação!

IronmanX46
fonte
Com o Swift5 e o modo escuro, você pode até usar as cores do sistema:self.textViewName.layer.borderColor = UIColor.systemGray4.cgColor
multitudes
4

para programação rápida, use este

tv_comment.layer.borderWidth = 2
tv_comment.layer.borderColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1).CGColor
Sruit A.Suk
fonte
Ou apenasUIColor(white: 0.2, alpha: 1).CGColor
Leo
3

isso é o mais próximo que pude de um UITextField original

func updateBodyTextViewUI() {
    let borderColor = UIColor.init(red: 212/255, green: 212/255, blue: 212/255, alpha: 0.5)

    self.bodyTextView.layer.borderColor = borderColor.CGColor
    self.bodyTextView.layer.borderWidth = 0.8
    self.bodyTextView.layer.cornerRadius = 5
}
Matias Elorriaga
fonte
1

você pode adicionar borda ao UITextView no Storyboard - Identity Inspector - Atributo de tempo de execução definido pelo usuário

insira a descrição da imagem aqui

Dan Alboteanu
fonte
0

No iOS 8 e no Xcode 6, agora acho que a melhor solução é subclassificar o UITextView e marcar a subclasse como um IB_DESIGNABLE, o que permitirá visualizar a borda no storyboard.

Cabeçalho:

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface BorderTextView : UITextView

@end

Implementação:

#import "BorderTextView.h"

@implementation BorderTextView

- (void)drawRect:(CGRect)rect
{
    self.layer.borderWidth = 1.0;
    self.layer.borderColor = [UIColor blackColor].CGColor;
    self.layer.cornerRadius = 5.0f;
}

@end

Em seguida, arraste seu UITextView no storyboard e defina sua classe como BorderTextView

Mike
fonte
0

O que o fez funcionar (além de seguir as respostas aqui) é adicionar o borderStyleatributo:

#import <QuartzCore/QuartzCore.h>
..

phoneTextField.layer.borderWidth = 1.0f;
phoneTextField.layer.borderColor = [[UIColor blueColor] CGColor];
phoneTextField.borderStyle = UITextBorderStyleNone;
abbood
fonte
0

Apenas uma pequena adição. Se você aumentar um pouco a borda, ela interferirá no lado esquerdo e direito do texto. Para evitar isso, adicionei a seguinte linha:

self.someTextView.textContainerInset = UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0);
Sloba
fonte
0

No Swift 3, você pode usar as duas linhas a seguir:

myText.layer.borderColor = UIColor.lightGray.cgColor

myText.layer.borderWidth = 1.0
Amr Angry
fonte
-3

Eu resolvi esse problema no storyboard, colocando um totalmente desativado UIButtonpor trás do UITextViewe tornando a cor de fundo do UITextViewclearColor. Isso funciona sem a necessidade de código ou pacotes extras.

Brandon
fonte
3
Claro, isso não funciona no iOS 7, como os botões não têm bordas (os botões parecem com etiquetas agora)
Mike Gledhill