如何样式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 image
checkbox。
你可能想看看我的库叫做DCKit 。
你可以直接从Interface Builder
创build一个圆angular的文本视图(以及文本UIView
/button/纯UIView
):
它还有许多其他有用的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又添加了一些代码。 这是非常好的,但我发现第三方在另一个问题的答案 ,这似乎对我很有帮助。 我不仅在UITextView
search了类似的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,他的答案几乎在那里:)