UITextview'ı Yuvarlak Rect metin alanına benzer şekilde nasıl şekillendirebilirim?


170

Yorum oluşturucu olarak bir metin görünümü kullanıyorum.

Özellik denetçisinde, kenarlık stili özelliği gibi bir şey bulamıyorum, böylece yuvarlak bir rekt, yani bir şey kullanabilirim UITextField.

Öyleyse, soru şu: Yuvarlak bir rektöre sahip bir UITextViewbenzeri nasıl UITextFieldşekillendirebilirim?


1
Kullanamaz UITextFieldve sadece kapatabilir userInteractionEnabledmisiniz?
jowie

Yanıtlar:


285

Seçmeniz gereken örtülü bir stil yoktur, QuartzCoreçerçeveyi kullanarak biraz kod yazmayı içerir :

//first, you
#import <QuartzCore/QuartzCore.h>

//.....

//Here I add a UITextView in code, it will work if it's added in IB too
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 220, 200, 100)];

//To make the border look very close to a UITextField
[textView.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor]];
[textView.layer setBorderWidth:2.0];

//The rounded corner part, where you specify your view's corner radius:
textView.layer.cornerRadius = 5;
textView.clipsToBounds = YES;

Sadece OS 3.0 ve üzeri sürümlerde çalışıyor, ama sanırım şimdi de facto platform.


47
Yukarıdaki kod ekleyerek buldum yukarıdaki kod kenar çok UITextField yakın yapar. [textView.layer setBorderColor: [[[UIColor grisiColor] colorWithAlphaComponent: 0.5] CGColor]]; [textView.layer setBorderWidth: 2.0];
Rob

12
Şunlara sahip olduğunuzdan emin olun: #import <QuartzCore / QuartzCore.h>. Ben QuartzCore ithal etmedi çünkü sorunları vardı
Austen

1
Benim gibi n00bs için, kayda değer: Bu kodu viewDidLoad'a koy initWithNibName :-)
Brian Colavito

1
Sen sadece bir kullanabilirsiniz UITextFieldile borderStylemülk kümesi UITextBorderStyleRoundedRect- aşağıya benim yayını görebilecek.
jowie

5
iOS 7 - sınır genişliği 1.0 ve alfa .2 varsayılan stille çalışır.
Kalel Wade

77

bu kod benim için iyi çalıştı:

    [yourTextView.layer setBackgroundColor: [[UIColor whiteColor] CGColor]];
    [yourTextView.layer setBorderColor: [[UIColor grayColor] CGColor]];
    [yourTextView.layer setBorderWidth: 1.0];
    [yourTextView.layer setCornerRadius:8.0f];
    [yourTextView.layer setMasksToBounds:YES];

4
5 pikselin metin alanlarına daha yakın olduğunu söyleyebilirim, ancak bu yanıtın gri rengi seçilen yanıttan daha iyi.
Peter DeWeese

2
Tabii ki bu cevap için QuartzCore Framework eklemeniz ve #import <QuartzCore / QuartzCore.h>
lukaswelte 7:13

36

Swift 3 Sürümü

Arayüz oluşturucuda metin görünümünü ayarladıktan sonra.

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    textView.layer.cornerRadius = 5     
    textView.layer.borderColor = UIColor.gray.withAlphaComponent(0.5).cgColor
    textView.layer.borderWidth = 0.5  
    textView.clipsToBounds = true
}

Swift 2.2 Sürümü

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    textView.layer.cornerRadius = 5     
    textView.layer.borderColor = UIColor.grayColor().colorWithAlphaComponent(0.5).CGColor
    textView.layer.borderWidth = 0.5  
    textView.clipsToBounds = true
}

1
Sorun tam olarak gri olmaması. UITextField çerçevesinin rengi biraz farklı.
Makalele

1
.BorderWidth = 0.7 yapmak, iOS 11'de gördüğüm mevcut stile daha yakın görünmesini sağlar
Chris Amelinckx

28

Düzenle: İçe aktarmanız gerekiyor

#import <QuartzCore/QuartzCore.h>

köşe yarıçapını kullanmak için.

Kesinlikle çalışacak bunu deneyin

UITextView* txtView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 300, 100)];
txtView.layer.cornerRadius = 5.0;
txtView.clipsToBounds = YES;

Rob'un kenarlık renginin benzer olmasını isteyip istemediğinizi ayarlayarak UITextField, aşağıdaki satırı ekleyerek kenarlık genişliğini 2.0'a ve rengi griye değiştirmeniz gerekir.

[textView.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor]]; 
[textView.layer setBorderWidth:2.0];

2
Bunun neden işe yaramadığını merak ediyordum. QuartzCore hakkındaki bahşiş için teşekkürler.
Echilon

23

Ben gerçek bir anlaşma istedim, bu yüzden UIImageViewbir alt görünümü olarak ekleyin UITextView. Bu UITextField, yukarıdan aşağıya gradyan da dahil olmak üzere a üzerindeki yerel kenarlıkla eşleşir :

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

Bunlar benim kullandığım görüntüler:

resim açıklamasını buraya girin resim açıklamasını buraya girin


2
Ayrıca, zaten
XCode'da

1
Png resimlerini tekrar yükledim
Ben Packard

5
İyi değil, UITextView'ı kaydırdıkça arka plan hareket ediyor. Sanırım hepsini bir ebeveyn UIView'e yerleştirmem gerekecek.
Oliver Pearmain

1
Mükemmel. Harika görünüyor: D
Sune Trudslev

12

Bir çözüm, UITextView altına bir UITextField eklemek , UITextViewarka planı saydam yapmak ve üzerindeki herhangi bir kullanıcı etkileşimini devre dışı bırakmaktır UITextField. Sonra kodda UITextFieldböyle bir şeyle çerçeveyi değiştirin

self.textField.frame = CGRectInset(self.textView.frame, 0, -2);

Metin alanıyla tamamen aynı görünüme sahip olacaksınız.

Jon'un önerdiği gibi , bu kod parçasını [UIViewController viewDidLayoutSubviews]iOS 5.0+ üzerine yerleştirmelisiniz .


1
Bu çok basitti ve tam olarak nasıl görünmesini istediğime benziyor. Ben sadece UITextField çerçeve UITextView ile eşleşti: CGRect frame = self.myTextView.frame; frame.size.height + = 2; self.myTextField.frame = çerçeve;
Brian

1
Güzel cevap. Temiz ve basit. Kodu viewDidLayoutSubviews:(iOS 5.0+) içine koyun .
Jon

1
Güzel, bu sonunda gittiğim soln oldu. Jon'un yorumunu kullanana kadar işe yaramadığını unutmayın re: viewDidLayoutSubviews:
daver

1
Bu en hızlıydı ve en iyi görünüyor.
Weston

5

En iyi etki için özel (gerilebilir) bir arka plan resmi kullanmanız gerekir. Ayrıca UITextFieldyuvarlatılmış kenarlık bu şekilde çizilir.


4

Programlama yapmadan bulduğum bir yol, metin alanı arka planını saydam yapmak, ardından arkasına bir Yuvarlak Doğrultma Düğmesi koymaktır. Devre dışı bırakmak için düğme ayarlarını değiştirdiğinizden emin olun ve onay Disable adjusts imagekutusunun işaretini kaldırın .


4

DCKit adlı kütüphanemi kontrol etmek isteyebilirsiniz .

Doğrudan köşeden yuvarlatılmış köşe metin görünümü (ayrıca metin alanı / düğme / düz UIView) yapabilirsiniz Interface Builder:

DCKit: sınırlandırılmış UITextView

Ayrıca, doğrulama içeren metin alanları, kenarlıklı kontroller, kesik kenarlıklar, daire ve saç çizgisi görünümleri gibi birçok yararlı özelliğe sahiptir.


4

Bunun zaten çok fazla cevabı olduğunu biliyorum, ama bunların hiçbirini yeterli bulmadım (en azından Swift'te). Bir UITextField (şu anda göründüğü gibi görünüyor, ama tam olarak öyle görünüyor ve her zaman tam olarak benzeyecek gibi görünüyor yaklaşık bir değil) aynı sınır sağlayan bir çözüm istedim. Arka plan için UITextView yedeklemek için bir UITextField kullanmak gerekiyordu, ama her seferinde ayrı ayrı oluşturmak zorunda değildi.

Aşağıdaki çözüm, kenarlık için kendi UITextField öğesini sağlayan bir UITextView. Bu, tam çözümümün kesilmiş bir versiyonudur (UITextView'e benzer bir şekilde "yer tutucu" desteği ekler) ve buraya gönderildi: https://stackoverflow.com/a/36561236/1227119

// This class implements a UITextView that has a UITextField behind it, where the 
// UITextField provides the border.
//
class TextView : UITextView, UITextViewDelegate
{
    var textField = TextField();

    required init?(coder: NSCoder)
    {
        fatalError("This class doesn't support NSCoding.")
    }

    override init(frame: CGRect, textContainer: NSTextContainer?)
    {
        super.init(frame: frame, textContainer: textContainer);

        self.delegate = self;

        // Create a background TextField with clear (invisible) text and disabled
        self.textField.borderStyle = UITextBorderStyle.RoundedRect;
        self.textField.textColor = UIColor.clearColor();
        self.textField.userInteractionEnabled = false;

        self.addSubview(textField);
        self.sendSubviewToBack(textField);
    }

    convenience init()
    {
        self.init(frame: CGRectZero, textContainer: nil)
    }

    override func layoutSubviews()
    {
        super.layoutSubviews()
        // Do not scroll the background textView
        self.textField.frame = CGRectMake(0, self.contentOffset.y, self.frame.width, self.frame.height);
    }

    // UITextViewDelegate - Note: If you replace delegate, your delegate must call this
    func scrollViewDidScroll(scrollView: UIScrollView)
    {
        // Do not scroll the background textView
        self.textField.frame = CGRectMake(0, self.contentOffset.y, self.frame.width, self.frame.height);
    }        
}

3

Programlama yapmadan bulduğum bir yol, metin alanı arka planını saydam yapmak, ardından arkasına bir Yuvarlak Doğrultma Düğmesi yerleştirmektir. Devre dışı bırakmak için düğme ayarlarını değiştirdiğinizden emin olun ve Devre dışı bırakılan görüntüyü devre dışı bırak onay kutusunun işaretini kaldırın.

Quartzcore kodunu denedim ve eski 3G (test için kullanıyorum) üzerinde gecikmeye neden olduğunu buldu. Büyük bir sorun değil, ancak farklı ios ve donanım için mümkün olduğunca kapsayıcı olmak istiyorsanız, Andrew_L'ın yukarıdaki cevabını öneriyorum - veya kendi görüntülerinizi yapın ve buna göre uygulayın.



3
#import <QuartzCore/QuartzCore.h>
- (void)viewDidLoad{
  UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 220, 200, 100)];
  textView.layer.cornerRadius = 5;
  textView.clipsToBounds = YES;
  [textView.layer setBackgroundColor: [[UIColor whiteColor] CGColor]];
  [textView.layer setBorderColor: [[UIColor grayColor] CGColor]];
  [textView.layer setBorderWidth: 1.0];
  [textView.layer setCornerRadius:8.0f];
  [textView.layer setMasksToBounds:YES];
  [self.view addSubView:textview];
}

2

Metin Görünümü'nün üstündeki hiçbir olayı kabul etmeyen bir Metin Alanı oluşturabilirsiniz:

CGRect frameRect = descriptionTextField.frame;
frameRect.size.height = 50;
descriptionTextField.frame = frameRect;
descriptionTextView.frame = frameRect;
descriptionTextField.backgroundColor = [UIColor clearColor];
descriptionTextField.enabled = NO;
descriptionTextView.layer.cornerRadius = 5;
descriptionTextView.clipsToBounds = YES;

Veya arayüz oluşturucuda bir metin alanı yapın. Daha sonra kodda yüksekliği ayarlayın (arayüz oluşturucu izin vermeyeceğinden). CGRect frameRect = self.textField.frame; frameRect.size.height = 50; self.textField.frame = frameRect;
audub

2

Denetleyici kodunuzu temiz tutmak istiyorsanız, aşağıdaki gibi UITextView alt sınıfını sınıflandırabilir ve Arayüz Oluşturucu'da sınıf adını değiştirebilirsiniz.

RoundTextView.h

#import <UIKit/UIKit.h>
@interface RoundTextView : UITextView
@end

RoundTextView.m

#import "RoundTextView.h"
#import <QuartzCore/QuartzCore.h>
@implementation RoundTextView
-(id) initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.333] CGColor]];
        [self.layer setBorderWidth:1.0];
        self.layer.cornerRadius = 5;
        self.clipsToBounds = YES;
    }
    return self;
}
@end

1

İşte benim çözümüm:

- (void)viewDidLoad {
    [super viewDidLoad];


    self.textView.text = self.messagePlaceholderText;
    self.textView.layer.backgroundColor = [[UIColor whiteColor] CGColor];
    self.textView.layer.borderColor = [[[UIColor grayColor] colorWithAlphaComponent:0.3] CGColor];
    self.textView.layer.borderWidth = 0.5;
    self.textView.layer.cornerRadius = 5.5f;
    self.textView.layer.masksToBounds = YES;
    self.textView.textColor = [[UIColor grayColor] colorWithAlphaComponent:0.4];
}

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if (textView == self.tvMessage) {
        // Delete placeholder text
        if ([self.textView.text isEqualToString:self.messagePlaceholderText]) {
            self.textView.text = @"";
            self.textView.textColor = [UIColor blackColor];
        }
    }
}

- (void)textViewDidEndEditing:(UITextView *)textView {
    if (textView == self.tvMessage) {
        // Write placeholder text
        if (self.textView.text.length == 0) {
            self.textView.text = self.messagePlaceholderText;
            self.textView.textColor = [[UIColor grayColor] colorWithAlphaComponent:0.4];
        }
    }
}

0

Bunun mümkün olduğunu düşünmüyorum. ancak UITableView1 bölüm ve 1 boş hücre ile (gruplandırılmış) yapabilir ve bunu sizin için bir kap olarak kullanabilirsiniz UITextView.


0

Bu eski bir soru ve ben de bu soruların cevabını aradım. luvieeres'in cevabı% 100 doğrudur ve daha sonra Rob bazı kodlar ekledi. Bu mükemmel, ama benim için çok yararlı görünüyor başka bir soru cevap üçüncü bir taraf buldum . Sadece benzer bir görünüm araması yapılmamıştır UITextFieldüzerinde UITextViewben de satırlı destek için arama yapıldı. ChatInputSample her ikisini de tatmin etti. Bu yüzden bu üçüncü tarafın başkalarına yardımcı olabileceğini düşünüyorum. Ayrıca Timur sayesinde, o bu açık kaynak söz burada .


0

İOS7'de aşağıdakiler UITextField sınırıyla mükemmel bir şekilde eşleşir (en azından gözüme):

textField.layer.borderColor = [[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor];
textField.layer.borderWidth = 0.5;
textField.layer.cornerRadius = 5;
textField.clipsToBounds = YES;

Özel bir şey ithal etmeye gerek yoktur.

@Uvieere ve cevapları neredeyse oraya giden @hanumanDev sayesinde :)


-1

Peki ya:

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 280, 32)];
textField.borderStyle = UITextBorderStyleRoundedRect;
[self addSubview:textField];

soru metin görünümü ile ilgilidir.
Azik Abdullah

Maalesef mutlu yığın yanıtını tetikleyin. Neden sadece bir set UITextFieldile kullanamadıklarını bilmek isterdim . userInteractionEnabledNO
jowie

Textfield birden fazla satırı desteklemiyor
Azik Abdullah

anladım. Açıklamak için teşekkürler
jowie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.