Я хотел бы создать представление, подобное приложению для заметок на iPhone, и поэтому мне нужно, чтобы представление имело линейчатые линии в соответствии с приложением для заметок, я сделал это в окнах, где вам нужно получить метрики шрифта, а затем нарисовать линии на устройстве контекст, сделал ли кто-нибудь это в UITextView, если бы некоторая помощь была оценена
Рисование линейчатых линий в UITextView для IPhone
Ответы (4)
Подкласс 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;
Это не идеально. В идеале вы должны просто рисовать в переданный прямоугольник. Но я был ленив, и это работало для моих нужд.
Я думаю, что это работает нормально, но я чувствую, что он был взломан, и я не совсем понимаю механизм класса 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
Боб
self.contentMode = UIViewContentModeRedraw;
@Dave в метод инициализации подклассов вместо вашего метода setNeedsDisplay
.
- person reggian; 24.05.2012
Вы можете попробовать установить backgroundColor вашего textView, используя изображение с линейчатыми линиями.
textView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"RuledLinesPage.png"]];
Цвет с изображением шаблона создает мозаичное изображение, если область, которая должна быть заполнена цветом, больше, чем изображение. Таким образом, вам нужно будет убедиться, что размер изображения соответствует размеру/мозаичности (я не думаю, что «мозаичное» — это настоящее слово, но я надеюсь, вы поняли, что я имею в виду). Также вам нужно будет создать изображение с линейчатыми линиями, чтобы лучше всего соответствовать шрифту textView.
Удачи.
@lukya, ваше решение немного запутано, так как когда мы прокручиваем UITextView, текст только прокручивается, оставляя строки (исходящие из изображения) на своем месте.
Лучшим решением было бы добавить подвид к вашему текстовому представлению, где вы нарисовали линии. Вам нужно добавить наблюдателя к текстовому представлению, чтобы отслеживать изменение размера содержимого по мере увеличения/уменьшения текста.