Umrandete UITextView

127

Ich möchte einen dünnen grauen Rand um a haben UITextView. Ich habe die Apple-Dokumentation durchgesehen, konnte dort jedoch keine Immobilie finden. Bitte helfen Sie.

Ali
quelle

Antworten:

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
quelle
62
Ich dachte nicht, dass es wirklich viel Erklärung braucht, die Ansicht ist die UITextView und der Code geht dorthin, wo Sie die Ansicht eingerichtet haben (awakeFromNib oder viewDidLoad sind zwei mögliche Stellen). Da kein Code angegeben wurde, gibt es keine Möglichkeit, als Antwort einen guten Kontext anzugeben.
Kendall Helmstetter Gelner
Mit XCode kann ich keinen Rand für die Ebene festlegen. Es heißt, dass die Ebene schreibgeschützt ist. Ich habe UIView erstellt (wo einige Elemente eingefügt wurden) und versucht, den Rand für diese Ansicht festzulegen. Der Versuch, dies zu tun self.myView.layer.borderWidth ..., aber wie gesagt, die Ebene ist schreibgeschützt, sodass die Ebene keine Methoden oder Variablen zum
Festlegen
2
Haben Sie QuartzCore importiert? Sie können auch versuchen, einen CALayer aus self.myView herauszuholen und borderWidth darauf zu setzen. Es ist einstellbar.
Kendall Helmstetter Gelner
Weitere Informationen zum schreibgeschützten "Layer" in UIView (die Layer-Eigenschaft ist, aber Sie können Werte im Layer für eine Ansicht festlegen
Kendall Helmstetter Gelner
42

Fügen Sie für abgerundete Ecken Folgendes hinzu:

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

Hier ist der Code, den ich verwendet habe, um einen Rahmen um mein TextViewSteuerelement mit dem Namen "tbComments" hinzuzufügen:

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

Und so sieht es aus:

Geben Sie hier die Bildbeschreibung ein

Kinderleicht.

Mike Gledhill
quelle
19

Ich füge UIImageViewals Unteransicht der UITextView. Dies entspricht dem nativen Rand auf a UITextField, einschließlich des Verlaufs von oben nach unten:

Geben Sie hier die Bildbeschreibung ein

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

Dies sind die von mir verwendeten PNG-Bilder und eine JPG-Darstellung:

@ 1x

@ 2x

Geben Sie hier die Bildbeschreibung ein

Ben Packard
quelle
Gute Lösung. Sind diese Bilder deine? Können wir sie verwenden?
James Webster
Diese Bilder sind denen nachempfunden, die in Apples eigenen Apps verwendet werden. In Wahrheit habe ich sie extrahiert und nur sehr wenige, wenn überhaupt, Änderungen vorgenommen. Benutzung auf eigene Gefahr. Das Ziel war es, das native Erscheinungsbild nachzuahmen, sodass es schwierig ist, etwas zu finden, das ganz anders aussieht. Für das, was es wert ist, habe ich Apps mit diesem Bild ohne Probleme ausgeliefert und genehmigt.
Ben Packard
Die PNG-Bilddateien scheinen entfernt worden zu sein. Ich beabsichtige nicht, dies ständig mit einem neuen Bildspeicherort zu aktualisieren. Ich entschuldige mich, wenn das JPG für Sie nicht funktioniert. Ich kann nach Bedarf per Kommentar erneut hochladen.
Ben Packard
3
Mit dem angehängten Bild funktioniert dies am besten: coderesizableImageWithCapInsets: UIEdgeInsetsMake (28, 14, 28, 14)
RefuX
Die WikiUpload-Links (für die beiden Bilder) können die Bilddateien jetzt nicht finden. ;-(
Mike Gledhill
18

Funktioniert super, aber die Farbe sollte a sein CGColor, nicht UIColor:

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

Ich glaube, die obigen Antworten beziehen sich auf die vorherigen Versionen von Swift. Ich habe ein bisschen gegoogelt und der folgende Code funktioniert für Swift 4. Teilen Sie ihn einfach für jeden, der davon profitiert.

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

Viel Spaß beim Codieren!

IronmanX46
quelle
Mit Swift5 und dem Dunkelmodus können Sie sogar die Systemfarben verwenden:self.textViewName.layer.borderColor = UIColor.systemGray4.cgColor
Vielzahl
4

Verwenden Sie diese Option für die schnelle Programmierung

tv_comment.layer.borderWidth = 2
tv_comment.layer.borderColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1).CGColor
Obst A.Suk
quelle
Oder einfachUIColor(white: 0.2, alpha: 1).CGColor
Leo
3

Dies ist so nah wie möglich an einem originalen 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
}
Matias Elorriaga
quelle
1

Sie können UITextView über das Storyboard - Identity Inspector - Benutzerdefiniertes Laufzeitattribut einen Rahmen hinzufügen

Geben Sie hier die Bildbeschreibung ein

Dan Alboteanu
quelle
0

Ab iOS 8 und Xcode 6 finde ich jetzt die beste Lösung darin, UITextView zu unterklassifizieren und die Unterklasse als IB_DESIGNABLE zu markieren, damit Sie den Rand im Storyboard anzeigen können.

Header:

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface BorderTextView : UITextView

@end

Implementierung:

#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

Ziehen Sie dann einfach Ihre UITextView in das Storyboard und setzen Sie ihre Klasse auf BorderTextView

Mike
quelle
0

Die Sache, die es funktioniert hat (zusätzlich zu den Antworten hier), ist das Hinzufügen des borderStyleAttributs:

#import <QuartzCore/QuartzCore.h>
..

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

Nur eine kleine Ergänzung. Wenn Sie den Rand etwas breiter machen, beeinträchtigt dies die linke und rechte Seite des Texts. Um dies zu vermeiden, habe ich die folgende Zeile hinzugefügt:

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

In Swift 3 können Sie die folgenden zwei Zeilen verwenden:

myText.layer.borderColor = UIColor.lightGray.cgColor

myText.layer.borderWidth = 1.0
Amr wütend
quelle
-3

Ich habe dieses Problem im Storyboard gelöst, indem ich ein vollständig deaktiviertes Element UIButtonhinter das UITextViewund die Hintergrundfarbe der UITextViewclearColor gesetzt habe. Dies funktioniert ohne zusätzlichen Code oder Pakete.

Brandon
quelle
3
Natürlich funktioniert dies nicht in iOS 7, da die Schaltflächen keine Kanten haben (die Schaltflächen sehen jetzt wie Beschriftungen aus)
Mike Gledhill