我有一个用于文本编辑的UITextView。默认情况下,文本周围的边距较小。我想将这个边距增加几个像素。
contentInset属性为我提供了边距,但它不会更改文本“wrap width”。文本以相同的宽度包装,额外的“边距”只会使视图水平滚动。
有没有办法让某个宽度的UITextView显示带有较窄“包裹宽度”的文字?
答案 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);
检查以下链接,它可能对您有用
答案 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