コメント作成者としてテキストビューを使用しています。
プロパティインスペクターでは、UITextField
のような丸みのある四角形を使用できるように、境界線スタイルプロパティのようなものは見つかりません。
質問は次のとおりです。どのようにしてUITextView
をUITextField
のように角丸長方形でスタイルできますか?
暗黙のスタイルを選択する必要はありません。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];
インターフェイスビルダーでテキストビューを設定した後。
@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
}
@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
}
編集:インポートする必要があります
#import <QuartzCore/QuartzCore.h>
コーナー半径を使用するため
これを試してみてください、それは確かに動作します
UITextView* txtView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 300, 100)];
txtView.layer.cornerRadius = 5.0;
txtView.clipsToBounds = YES;
Robが境界線の色をUITextField
と同じように設定することを考え出したので、次の行を追加して境界線の幅を2.0に変更し、色をグレーに変更する必要があります
[textView.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor]];
[textView.layer setBorderWidth:2.0];
本当の取引が欲しかったので、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];
これらは私が使用する画像です:
1つの解決策は、UITextViewの下にUITextFieldを追加し、UITextView
バックグラウンドを透明にし、UITextField
でのユーザー操作を無効にすることです。 。次に、コードでUITextField
フレームをそのようなものに変更します
self.textField.frame = CGRectInset(self.textView.frame, 0, -2);
テキストフィールドとまったく同じ外観になります。
Jon で示唆されているように、iOS 5.0以降では[UIViewController viewDidLayoutSubviews]
内にこのコードを配置する必要があります。
最高の効果を得るには、カスタム(伸縮可能な)背景画像を使用する必要があります。これは、UITextField
の丸い境界線の描画方法でもあります。
プログラミングせずにそれを実現する方法の1つは、テキストフィールドの背景を透明にし、その後ろに円形の四角形のボタンを配置することです。ボタンの設定を変更して無効にし、Disable adjusts image
チェックボックスをオフにしてください。
DCKit と呼ばれる私のライブラリをチェックアウトすることをお勧めします。
Interface Builder
から直接、角の丸いテキストビュー(およびテキストフィールド/ボタン/プレーンUIView
)を作成できます。
また、検証のあるテキストフィールド、境界線のあるコントロール、破線の境界線、円、ヘアラインビューなど、他の多くの便利な機能も備えています。
私はすでにこれに対する多くの答えがあることを知っていますが、私はそれらのどれも(少なくともSwiftで)十分に見つけることができませんでした。 UITextFieldとまったく同じ境界線を提供するソリューションが必要でした(現在のように見えるおおよそのものではなく、まったく同じように見え、常に常に同じように見えるもの)。 UITextFieldを使用して背景のUITextViewをバックアップする必要がありましたが、毎回個別に作成する必要はありませんでした。
以下のソリューションは、境界線に独自のUITextFieldを提供するUITextViewです。これは、完全なソリューションのトリミングバージョン(同様の方法で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);
}
}
#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];
}
IPhoneのメッセージアプリでテキストメッセージを送信するために使用されるUITextView
と同じ素晴らしい背景画像があります。 Adobe Illustratorを入手して変更する必要があります。 iphone uiベクトル要素
プログラミングせずにそれを実現する方法の1つは、テキストフィールドの背景を透明にし、その後ろに円形の四角形のボタンを配置することです。ボタンの設定を変更して無効にし、[画像の調整を無効にする]チェックボックスをオフにしてください。
Quartzcoreコードを試してみたところ、古い3Gで遅延が発生していることがわかりました(テストに使用しています)。大きな問題ではありませんが、さまざまなiosとハードウェアを可能な限り包括的にしたい場合は、上記のAndrew_Lの回答をお勧めします-または、独自の画像を作成して、それに応じて適用します。
次のように、テキストビューの上にイベントを受け入れないテキストフィールドを作成できます。
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;
コントローラーコードをクリーンに保ちたい場合は、以下のようにUITextViewをサブクラス化し、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
のコンテナとして使用できます。
私の解決策は次のとおりです。
- (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];
}
}
}
IOS7では、以下がUITextFieldの境界に完全に一致します(少なくとも私の目には)。
textField.layer.borderColor = [[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor];
textField.layer.borderWidth = 0.5;
textField.layer.cornerRadius = 5;
textField.clipsToBounds = YES;
特別なものをインポートする必要はありません。
@uvieereと@hanumanDevに感謝します。
これは古い質問であり、この質問の回答も検索しました。 luvieeresの答えは100%正しいもので、後にRobがコードを追加しました。それは素晴らしいですが、私は 別の質問の答え でサードパーティを見つけました。これは私にとって非常に役立つようです。 UITextField
とUITextView
の類似の外観を検索しただけでなく、複数行のサポートも検索しました。 ChatInputSample 両方を満たしました。だからこそ、このサードパーティは他の人に役立つと思うのです。また、ティムールのおかげで、彼は here でこのオープンソースについて言及しました。