テキスト編集用のUITextViewがあります。デフォルトでは、テキストの周りに小さなマージンがあります。そのマージンを数ピクセル増やしたいです。
ContentInsetプロパティはマージンを与えますが、テキストの「折り返し幅」は変更しません。テキストは同じ幅で折り返され、余分な「マージン」はビューを水平方向にスクロールさせるだけです。
特定の幅のUITextViewに、より狭い「折り返し幅」でテキストを表示させる方法はありますか?
IOS 7以降では、textContainerInset
プロパティを使用できます。
Objective-C
textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 20);
スイフト
textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
しばらくこれをいじくり回した後、iOS 6のみを開発している場合は別の解決策を見つけました。上と下のマージンをcontentInsetで設定します。
textView = [[UITextView alloc] init];
textView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 20.0, 0.0);
左右のマージンについては、プレーンテキストをすぐに追加するのではなく、代わりにNSAttributedStringを使用し、代わりにNSMutableParagraphStyleで適切に設定された左右のインデントを使用します。
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.headIndent = 20.0;
paragraphStyle.firstLineHeadIndent = 20.0;
paragraphStyle.tailIndent = -20.0;
NSDictionary *attrsDictionary = @{NSFontAttributeName: [UIFont fontWithName:@"TrebuchetMS" size:12.0], NSParagraphStyleAttributeName: paragraphStyle};
textView.attributedText = [[NSAttributedString alloc] initWithString:myText attributes:attrsDictionary];
これにより、適切にスクロールする20ピクセルのパディングを含むテキスト(私の場合は変数myTextから)を含むUITextViewが提供されます。
これを試して
UIBezierPath* aObjBezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 20)];
txtView.textContainer.exclusionPaths = @[aObjBezierPath];
より小さなUITextViewを使用し、バックグラウンドにUIViewを配置してパディングをシミュレートすることができます。
+----------+
| | <-- UIView (as background)
| +--+ |
| | | <---- UITextView
| | | |
| +--+ |
| |
+----------+
提案をありがとう。 macOS/OSXアプリの開発時にこの問題が発生し、最終的には次のようになりました。
textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins
これは私のために働いています。 textView contentInsetとフレームのインセット/位置を変更して、正しいパディングとワードラップを取得します。次に、textViewの境界を変更して、水平スクロールを防止します。また、テキストが選択および変更されるたびにパディングをリセットする必要があります。
- (void)setPadding
{
UIEdgeInsets padding = UIEdgeInsetsMake(30, 20, 15, 50);
textView.contentInset = padding;
CGRect frame = textView.frame;
// must change frame before bounds because the text wrap is reformatted based on frame, don't include the top and bottom insets
CGRect insetFrame = UIEdgeInsetsInsetRect(frame, UIEdgeInsetsMake(0, padding.left, 0, padding.right));
// offset frame back to original x
CGFloat offsetX = frame.Origin.x - (insetFrame.Origin.x - ( padding.left + padding.right ) / 2);
insetFrame = CGRectApplyAffineTransform(insetFrame, CGAffineTransformMakeTranslation(offsetX, 0));
textView.frame = insetFrame;
textView.bounds = UIEdgeInsetsInsetRect(textView.bounds, UIEdgeInsetsMake(0, -padding.left, 0, -padding.right));
[textView scrollRectToVisible:CGRectMake(0,0,1,1) animated:NO];
}
-(void)textViewDidChangeSelection:(UITextView *)textView
{
[self setPadding];
}
-(void)textViewDidChange:(UITextView *)textView
{
[self setPadding];
}
Swift + iOS 12:異なるアプローチ
UITextView
の左側と右側にパディングを設定すると、9行を超えるテキストを入力したときにテキストが消えます。 @rajeshのソリューションを使用すると、この問題の解決に役立ちました。
テキストが変更され、デバイスが回転するたびに必ずメソッドを呼び出してください。
/// Updates the left + right padding of the current text view.
/// -> leftRightPadding value = 11.0
func updateLeftRightPadding() {
let leftPadding = UIBezierPath(rect: .init(x: 0.0, y: 0.0,
width: leftRightPadding, height: contentSize.height))
let rightPadding = UIBezierPath(rect: .init(x: frame.width - leftRightPadding, y: 0.0,
width: 11, height: contentSize.height))
textContainer.exclusionPaths = [leftPadding, rightPadding]
}
以下のコードを試してください
IOS7の場合はtextContainerInsetを使用します
textView.textContainerInset = UIEdgeInsetsMake(0、20、0、20);
あなたに役立つかもしれないリンクを以下で確認してください
片側からパディングを設定したい場合、以下のコードを使用できます:
textView.contentInset.left = 5 //For left padding
textView.contentInset.right = 5 //For right padding
textView.contentInset.top = 5 //For top padding
textView.contentInset.bottom = 5 //For bottom padding