IOS7中的内衬UITextView
Posted
技术标签:
【中文标题】IOS7中的内衬UITextView【英文标题】:Lined UITextView in IOS7 【发布时间】:2013-09-17 16:47:53 【问题描述】:我有一个 UITextView(自定义控件 DLinedTextView)的子类,我在其中绘制横线文本。它在 ios5 和 iOS6 上完美运行,但在 iOS7 上失败(文本与行不匹配)。
- (void)drawRect:(CGRect)rect
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0f);
if (self.horizontalLineColor)
CGContextBeginPath(context);
CGContextSetStrokeColorWithColor(context, self.horizontalLineColor.CGColor);
// Create un-mutated floats outside of the for loop.
// Reduces memory access.
CGFloat baseOffset = 7.0f + self.font.descender;
CGFloat screenScale = [UIScreen mainScreen].scale;
CGFloat boundsX = self.bounds.origin.x;
CGFloat boundsWidth = self.bounds.size.width;
// Only draw lines that are visible on the screen.
// (As opposed to throughout the entire view's contents)
NSInteger firstVisibleLine = MAX(1, (self.contentOffset.y / self.font.lineHeight));
NSInteger lastVisibleLine = ceilf((self.contentOffset.y + self.bounds.size.height) / self.font.lineHeight);
for (NSInteger line = firstVisibleLine; line <= lastVisibleLine; ++line)
CGFloat linePointY = (baseOffset + (self.font.lineHeight * line));
// Rounding the point to the nearest pixel.
// Greatly reduces drawing time.
CGFloat roundedLinePointY = roundf(linePointY * screenScale) / screenScale;
CGContextMoveToPoint(context, boundsX, roundedLinePointY);
CGContextAddLineToPoint(context, boundsWidth, roundedLinePointY);
CGContextClosePath(context);
CGContextStrokePath(context);
if (self.verticalLineColor)
CGContextBeginPath(context);
CGContextSetStrokeColorWithColor(context, self.verticalLineColor.CGColor);
CGContextMoveToPoint(context, -1.0f, self.contentOffset.y);
CGContextAddLineToPoint(context, -1.0f, self.contentOffset.y + self.bounds.size.height);
CGContextClosePath(context);
CGContextStrokePath(context);
我知道这与 UIFont 指标有关。也许有人可以帮助我吗?我已将 contentSize 更改为 intrinsicContentSize 但它不起作用。
如果我使用 systemFontOfSize 它可以完美运行,但使用 fontWithName 会失败。
【问题讨论】:
【参考方案1】:我已经为这个奇怪的问题苦苦挣扎了很长一段时间,但最终偶然发现了一个合法的解决方案:
textView.layoutManager.usesFontLeading = NO;
这使得UITextView
呈现文本(几乎)与UILabel
相同。
【讨论】:
【参考方案2】:是的,我认为您正在使用自定义控件DALinedTextView
。
我也面临你在 iOS7 中所说的问题。
即使您无法在iOS7
中正确滚动该控件。
首先我使用该控件,现在我离开它并使用内置的UITextView
。 :D
也许,您需要更改textView
的font size
和text margin
或text padding
。
【讨论】:
嘿,但是您使用的是 lined uitextview 吗?我也完成了我自己的实现,但我无法做到正确,它只适用于自定义字体 (ttf) 或 systemfont... 不,兄弟。我也像你一样使用 DLinedTextView。它在 iOS7 中不起作用。 是的,兄弟。我知道 。但是我使用自定义字体。这就是为什么我不能使用这个控件。 :D 如果您找到解决方案,请告诉我...否则我将不得不为 iOS 上所有可用字体查找 .ttf 文件..【参考方案3】:检查此link。 它使用在 ios7 中使用的 NSLayoutManagerDelegate。 对于 iOS 7,styleString 方法不再有效。 你必须使用NSLayoutManagerDelegate,它很容易使用。
txtViewNote.layoutManager.delegate = self;
txtViewNote.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"textView_bg_lines"]];
- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager lineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect
return 20.5; // For really wide spacing
【讨论】:
没有解决问题...系统字体以外的字体行高仍然错误.. 可能是因为你在画画,我在用图片。 你能举个例子说明你是怎么做的吗?它适用于所有 ios 字体? 你能把你正在使用的图片贴出来吗,我不能让它工作..还有你用的是什么uifont?以上是关于IOS7中的内衬UITextView的主要内容,如果未能解决你的问题,请参考以下文章
string.split 返回一个字符串 [] 我想要一个 List<string> 是不是有一个内衬可以将数组转换为列表?