UITextView с границей

127

Я хочу, чтобы вокруг файла UITextView. Я просмотрел документацию Apple, но не нашел там никакой собственности. Пожалуйста помоги.

Али
источник

Ответы:

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];
Кендалл Хельмштеттер Гельнер
источник
62
Я не думал, что это действительно нужно много объяснять, представление - это UITextView, а код идет туда, где вы настраиваете представление (awakeFromNib или viewDidLoad - два возможных места). Поскольку не было предоставлено никакого кода, нет возможности дать хороший ответ в ответ.
Кендалл Хельмштеттер Гельнер,
XCode не позволяет мне устанавливать границу для слоя. Он говорит, что слой доступен только для чтения. Я сделал UIView (где поместил некоторые элементы) и попытался установить границу для этого представления. Пытаюсь сделать это self.myView.layer.borderWidth ..., но, как я уже сказал, слой
доступен
2
Вы импортировали QuartzCore? Вы также можете попробовать получить CALayer из self.myView и установить для него borderWidth. Это настраивается.
Кендалл Хельмштеттер Гельнер
Дополнительная информация о том, что «слой» доступен только для чтения в UIView (свойство слоя есть, но вы можете установить значения в слое для представления): stackoverflow.com/questions/12837077/…
Кендалл Хельмстеттер Гелнер,
42

Добавьте следующее для закругленных углов:

self.yourUITextview.layer.cornerRadius = 8; 
user542584
источник
23

Вот код, который я использовал, чтобы добавить границу вокруг моего TextViewэлемента управления с именем «tbComments»:

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

А вот как это выглядит:

введите описание изображения здесь

Очень просто.

Майк Гледхилл
источник
19

Я добавляю UIImageViewкак подвид UITextView. Это соответствует собственной границе на a UITextField, включая градиент сверху вниз:

введите описание изображения здесь

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];

Это изображения png, которые я использую, и представление jpg:

@ 1x

@ 2x

введите описание изображения здесь

Бен Паккард
источник
Хорошее решение. Эти изображения твои? Можем ли мы их использовать?
Джеймс Вебстер,
Эти изображения «смоделированы» на основе изображений, используемых в собственных приложениях Apple. По правде говоря, я извлек их и внес очень мало изменений, если вообще внес их. Используйте на свой риск. Цель заключалась в том, чтобы имитировать естественный внешний вид, поэтому трудно придумать что-то, что выглядело бы иначе. Чего бы это ни стоило, я без проблем отправил и получил одобренные приложения, использующие этот образ.
Бен Паккард
Файлы изображений png, похоже, были удалены - я не собираюсь постоянно обновлять их, добавляя новое расположение изображения, поэтому приношу свои извинения, если jpg не работает для вас. Я могу повторно загрузить, как и когда будет запрошено через комментарий.
Бен Паккард
3
С прикрепленным изображением это работает лучше всего: coderesizableImageWithCapInsets: UIEdgeInsetsMake (28, 14, 28, 14)
RefuX
Ссылки WikiUpload (для двух изображений) теперь не могут найти файлы изображений. ;-(
Майк Гледхилл
18

Отлично работает, но цвет должен быть а CGColor, а не UIColor:

view.layer.borderWidth = 5.0f;
view.layer.borderColor = [[UIColor grayColor] CGColor];
Мэтт Коннолли
источник
4
#import <QuartzCore / QuartzCore.h>
kolinko 03
6

Я считаю, что приведенные выше ответы относятся к предыдущим версиям Swift. Я немного погуглил, и приведенный ниже код работает для Swift 4. Просто поделитесь им для тех, кому это может быть полезно.

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

Удачного кодирования!

IronmanX46
источник
С Swift5 и темным режимом вы даже можете использовать системные цвета:self.textViewName.layer.borderColor = UIColor.systemGray4.cgColor
multumes
4

для быстрого программирования используйте это

tv_comment.layer.borderWidth = 2
tv_comment.layer.borderColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1).CGColor
Сруит А.Сук
источник
Или простоUIColor(white: 0.2, alpha: 1).CGColor
Лев
3

это как можно ближе к исходному UITextField

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
}
Матиас Элорриага
источник
1

вы можете добавить границу в UITextView из раскадровки - Инспектор идентичности - Пользовательский атрибут времени выполнения

введите описание изображения здесь

Дэн Альботяну
источник
0

Что касается iOS 8 и Xcode 6, я теперь считаю, что лучшим решением является создание подкласса UITextView и пометка подкласса как IB_DESIGNABLE, что позволит вам просматривать границу в раскадровке.

Заголовок:

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface BorderTextView : UITextView

@end

Реализация:

#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

Затем просто перетащите свой UITextView в раскадровку и установите для него класс BorderTextView.

Майк
источник
0

То, что заставило его работать (в дополнение к приведенным здесь ответам), - это добавление borderStyleатрибута:

#import <QuartzCore/QuartzCore.h>
..

phoneTextField.layer.borderWidth = 1.0f;
phoneTextField.layer.borderColor = [[UIColor blueColor] CGColor];
phoneTextField.borderStyle = UITextBorderStyleNone;
abbood
источник
0

Просто небольшое дополнение. Если вы сделаете границу немного шире, она будет мешать левой и правой стороне текста. Чтобы этого избежать, я добавил следующую строку:

self.someTextView.textContainerInset = UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0);
Sloba
источник
0

В Swift 3 вы можете использовать следующие две строки:

myText.layer.borderColor = UIColor.lightGray.cgColor

myText.layer.borderWidth = 1.0
Амр Злой
источник
-3

Я решил эту проблему в раскадровке, поставив полностью отключена UIButtonпозади UITextViewи сделать цвет фона UITextViewclearColor. Это работает без дополнительного кода или пакетов.

Brandon
источник
3
Конечно, в iOS 7 это не работает, так как кнопки не имеют краев (теперь кнопки выглядят как ярлыки)
Майк Гледхилл,