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

也许,您需要更改textViewfont sizetext margintext 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的主要内容,如果未能解决你的问题,请参考以下文章

sql 两个内衬为您的查询/会话启用SQL统计信息

string.split 返回一个字符串 [] 我想要一个 List<string> 是不是有一个内衬可以将数组转换为列表?

盒装卷烟包装系统各部分阻隔性能测试

为啥 iOS7 中的 UIAlertController 收到 nil 值?

iOS7中的UITabBar徽章位置

iOS7 中的 UIImagePickerController