在UITextView for iPhone上绘制划线

时间:2010-08-16 09:43:22

标签: iphone uitextview

我想创建一个像iPhone上的笔记应用程序的视图,因此需要视图根据笔记应用程序有格线,我在Windows中完成了这个,你需要获取字体指标,然后绘制线条在设备上下文中,有任何人在UITextView中完成此操作,如果这样一些帮助将被appriciated

4 个答案:

答案 0 :(得分:8)

UITextView子类。覆盖-drawRect:

- (void)drawRect:(CGRect)rect
{    
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
    CGContextSetLineWidth(context, self.lineWidth);
    CGFloat strokeOffset = (self.lineWidth / 2);

    CGFloat rowHeight = self.font.lineHeight;
    if (rowHeight > 0) {
        CGRect rowRect = CGRectMake(self.contentOffset.x, - self.bounds.size.height, self.contentSize.width, rowHeight);
        while (rowRect.origin.y < (self.bounds.size.height + self.contentSize.height)) {
            CGContextMoveToPoint(context, rowRect.origin.x + strokeOffset, rowRect.origin.y + strokeOffset);
            CGContextAddLineToPoint(context, rowRect.origin.x + rowRect.size.width + strokeOffset, rowRect.origin.y + strokeOffset);
            CGContextDrawPath(context, kCGPathStroke);
            rowRect.origin.y += rowHeight;
        }
    }
}

初始化文本视图时,请务必将contentMode设置为UIViewContentModeRedraw。否则,这些行不会随文本一起滚动。

self.contentMode = UIViewContentModeRedraw;

这并不完美。理想情况下,你应该只画入通过的矩形。但我很懒,这符合我的需要。

答案 1 :(得分:5)

我认为这样可行,但我觉得它已经被黑了,我并没有完全理解UITextView类的机制;

首先,您必须将以下内容添加到代理中以强制重绘滚动

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{   
    // NSLog(@"scrollViewDidScroll The scroll offset is ---%f",scrollView.contentOffset.y);
    [noteText setNeedsDisplay];
}

然后在子类中实现drawRect

- (void)drawRect:(CGRect)rect {
    // Drawing code
    // Get the graphics context
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    [super drawRect:rect];

    // Get the height of a single text line
    NSString *alpha = @"ABCD";
    CGSize textSize = [alpha sizeWithFont:self.font constrainedToSize:self.contentSize lineBreakMode:UILineBreakModeWordWrap];
    NSUInteger height = textSize.height;

    // Get the height of the view or contents of the view whichever is bigger
    textSize = [self.text sizeWithFont:self.font constrainedToSize:self.contentSize lineBreakMode:UILineBreakModeWordWrap];
    NSUInteger contentHeight = (rect.size.height > textSize.height) ? (NSUInteger)rect.size.height : textSize.height;

    NSUInteger offset = 6 + height; // MAGIC Number 6 to offset from 0 to get first line OK ???
    contentHeight += offset;
    // Draw ruled lines
    CGContextSetRGBStrokeColor(ctx, .8, .8, .8, 1);
    for(int i=offset;i < contentHeight;i+=height) {
        CGPoint lpoints[2] = { CGPointMake(0, i), CGPointMake(rect.size.width, i) };
        CGContextStrokeLineSegments(ctx, lpoints, 2);
    }
}

仍担心这个神奇数字6

鲍勃

答案 2 :(得分:1)

您可以尝试使用带有划线的图像

设置textView的backgroundColor
textView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"RuledLinesPage.png"]];

如果要填充颜色的区域大于图像,则使用图案图像的颜色会创建平铺图像。所以你必须确保图像大小正确的尺寸/ tileable(我不认为'tileable'是一个真正的单词,但我希望你得到我的意思)。此外,您还必须使用划线创建图像,以便与textView的字体最匹配。

祝你好运。

答案 3 :(得分:0)

@lukya, 你的解决方案有点混乱,因为当我们滚动UITextView时,文本只会滚动,留下线条(来自图像)到位。

更好的解决方案是将子视图添加到您绘制线条的文本视图中。您需要向文本视图添加观察者,以便在文本增加/减少时跟踪其内容大小的变化。