如何在UITextView中设置边距(填充)?

时间:2010-07-12 20:13:44

标签: iphone objective-c cocoa-touch ipad uitextview

我有一个用于文本编辑的UITextView。默认情况下,文本周围的边距较小。我想将这个边距增加几个像素。

contentInset属性为我提供了边距,但它不会更改文本“wrap width”。文本以相同的宽度包装,额外的“边距”只会使视图水平滚动。

有没有办法让某个宽度的UITextView显示带有较窄“包裹宽度”的文字?

9 个答案:

答案 0 :(得分:102)

从iOS 7开始,您可以使用textContainerInset属性:

<强>目标C

textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 20);

<强>夫特

textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)

答案 1 :(得分:34)

在摆弄了一段时间之后我找到了另一个解决方案,如果你只是为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];

这为您提供了一个UITextView,其中包含您的文本(在我的情况下来自变量 myText ),其中20像素填充正确滚动。

答案 2 :(得分:10)

试试这个

UIBezierPath* aObjBezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 20)];
txtView.textContainer.exclusionPaths  = @[aObjBezierPath];

答案 3 :(得分:7)

您可以使用较小的UITextView,并在后台放置UIView来模拟填充。

+----------+
|          | <-- UIView (as background)
|   +--+   |
|   |  | <---- UITextView
|   |  |   |
|   +--+   |
|          |
+----------+

答案 4 :(得分:1)

这对我有用。更改textView contentInset和frame inset / position以获取正确的填充和自动换行。然后更改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];
}

答案 5 :(得分:1)

感谢您的建议。 我在开发macOS / OSX应用程序时遇到了这个问题并最终得到了这个问题:

textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins

答案 6 :(得分:0)

尝试以下代码

对于iOS7,请使用textContainerInset

textView.textContainerInset = UIEdgeInsetsMake(0,20,0,20);

检查以下链接,它可能对您有用

https://stackoverflow.com/a/22935404/5184217

答案 7 :(得分:0)

Swift + iOS 12 另一种方法

import numpy as np from matplotlib import pyplot as plt # Random data to plot data = np.random.uniform(0., 1., (2, 100)) z = np.random.uniform(0., 10., 100) # Define figure fig, axes = plt.subplots(nrows=2, figsize=(30, 30)) for i, ax in enumerate(axes.flat): sc = ax.scatter(*data, c=z) cbar = fig.colorbar(sc, ax=ax, pad=0.01) cbar.set_label("test", fontsize=15, labelpad=10) fig.tight_layout() plt.savefig('test.png', dpi=300, bbox_inches='tight') 的左侧和右侧设置填充确实使该文本在输入9行以上时消失。使用@rajesh的解决方案有助于解决此问题:

请确保每当文本发生更改+设备旋转时就调用该方法。

UITextView

答案 8 :(得分:0)

如果要从一侧设置填充,则可以使用以下代码:

 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