Рисование линий на UITextView для IPhone - PullRequest
4 голосов
/ 16 августа 2010

Я хотел бы создать представление, подобное приложению заметок на iPhone, и поэтому мне нужно, чтобы представление имело линейки в соответствии с приложением заметок, я делал это в окнах, где нужно получить метрики шрифта, а затем нарисовать линиина контекст устройства, кто-нибудь сделал это в UITextView, если это так, некоторая помощь будет оценена

Ответы [ 4 ]

8 голосов
/ 02 декабря 2011

Подкласс UITextView.Override -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;

Это не идеально.В идеале вы должны просто нарисовать в проходной прямоугольник.Но мне было лень, и это сработало для моих нужд.

5 голосов
/ 18 августа 2010

Я думаю, что это работает нормально, но я чувствую, что он был взломан, и я не полностью понимаю механизм класса 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

Боб

1 голос
/ 16 августа 2010

Вы можете попробовать установить backgroundColor вашего textView, используя изображение с линиями

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

Цвет с рисунком изображения создает мозаичное изображение, если область, которая будет заполнена цветом, больше, чем изображение. Таким образом, вам нужно убедиться, что размер изображения - правильный размер / мозаичный (я не думаю, что «мозаичный» - это настоящее слово, но я надеюсь, вы понимаете, о чем я) Также вам нужно будет создать изображение с линейками, чтобы лучше всего соответствовать шрифту textView.

Удачи.

0 голосов
/ 18 августа 2010

@ lukya, Ваше решение немного запутано, поскольку, когда мы прокручиваем UITextView, текст прокручивает только оставляя линии (исходящие из изображения) на своем месте.

Лучшим решением было бы добавить подпредставление в текстовое представление, где вы нарисовали линии. Вам необходимо добавить наблюдателя в текстовое представление, чтобы отслеживать его изменение в размере содержимого при увеличении / уменьшении текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...