如何样式UITextview喜欢圆angular矩形文本字段?

我正在使用文本视图作为评论composer php。

在属性检查器中,我无法find任何类似于边框样式属性的东西,这样我就可以使用圆angular矩形,例如UITextField

所以,问题是:我怎样才能UITextView像一个UITextField的四舍五入?

没有隐含的风格,你必须select,它涉及到使用QuartzCore框架写一些代码:

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

它只适用于OS 3.0及以上版本,但我想现在它是事实上的平台。

这段代码适合我:

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

编辑:你必须导入

 #import <QuartzCore/QuartzCore.h> 

用于使用angular半径。

试试这个会肯定的

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

正如罗布想出来设置,如果你想边界颜色类似于UITextField那么你需要改变边界宽度为2.0和颜色灰色通过添加以下行

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

Swift 3版本

在界面构build器中设置文本视图后。

 @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版本

 @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 } 

我想要真正的交易,所以我添加UIImageView作为UITextView的子视图。 这匹配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]; 

这些是我使用的图像:

在这里输入图像描述在这里输入图像描述

一种解决scheme是在UITextView下面添加UITextField ,使UITextView背景透明,并禁用UITextField上的任何用户交互。 然后在代码中更改UITextField框架类似的东西

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

你将有一个文本字段完全一样的外观。

正如Jon所build议的,你应该把这段代码放在iOS 5.0+的[UIViewController viewDidLayoutSubviews]里面。

为了获得最佳效果,您必须使用自定义(可拉伸)的背景图片。 这也是如何绘制UITextField的圆形边框。

我发现没有编程的一种方法是使文本字段背景透明,然后在它后面放置一个Round Rect Button。 确保更改button设置以禁用它,并取消选中Disable adjusts imagecheckbox。

你可能想看看我的库叫做DCKit 。

你可以直接从Interface Builder创build一个圆angular的文本视图(以及文本UIView /button/纯UIView ):

DCKit:边界UITextView

它还有许多其他有用的function,如带有validation的文本字段,带边框的控件,虚线边框,圆圈和发际视图等。

我发现没有编程的一种方法是使文本字段背景透明,然后在其后面放置一个圆形矩形button。 确保更改button设置以禁用它,并取消选中禁用调整图像checkbox。

试了Quartzcore的代码,发现它导致我的旧3G(我用于testing)滞后。 不是一个大问题,但如果你想尽可能包容不同的ios和硬件,我build议Andrew_L的答案在上面 – 或者制作你自己的图片并相应地应用。

有一个伟大的背景图像是相同的UITextView用于在iPhone的消息应用程序中发送短信。 您需要使用Adobe Illustrator进行修改。 iphone uivector元素

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

我知道这个问题已经有很多答案了,但是我没有发现任何答案(至less在Swift中)。 我想要一个提供与UITextField完全相同的边界的解决scheme(不是近似的,看上去有点像现在的样子,但看起来完全一样,并且看起来完全一样)。 我需要使用UITextField来支持背景的UITextView,但不希望每次都分别创build。

下面的解决scheme是一个UITextView,它提供了自己的边界的UITextField。 这是我的完整解决scheme(它以类似的方式向UITextView添加“占位符”支持)的缩减版本,并张贴在这里: 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); } } 

您可以创build一个不接受文本视图顶部的任何事件的文本字段,如下所示:

 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; 

如果要保持控制器代码清洁,可以像下面那样inheritanceUITextView,并在Interface Builder中更改类名称。

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节和1个空单元做UITableView (分组),并用它作为UITextView的容器。

这是一个古老的问题,我也search了这个问题的答案。 luvieeres的答案是100%正确的,后来Rob又添加了一些代码。 这是非常好的,但我发现第三方在另一个问题的答案 ,这似乎对我很有帮助。 我不仅在UITextViewsearch了类似的UITextField ,还search了多行支持。 ChatInputSample满足。 这就是为什么我认为这个第三方可能对别人有帮助。 还要感谢帖木儿,他在这里提到了这个开源。

如何只是:

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

在iOS7中,以下内容与UITextField边界完美匹配(至less在我看来):

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

没有必要input任何特殊的东西。

感谢@uvieere和@hanumanDev,他的答案几乎在那里:)