Несколько запросов на рисование динамически iPhone - PullRequest
2 голосов
/ 07 июля 2011

Я пытаюсь сделать подсказки / подсказки для iPhone как часть учебного пособия, которое я делаю.Я следовал и объединил два кода, которые нашел здесь: (http://stackoverflow.com/questions/6049682/iphone-how-to-make-a-tip-balloon-programmatically/6052438#6052438) и другой (не могу найти ссылку, но почти уверен, что поставщиком кода был Брэд Ларсон (ура, чувак!)), Чтобы создать работающую, но ограниченную структуру

Идея: разработчик может импортировать готовые файлы, создать экземпляр нужной им стрелки направления, установить координаты и текст и назначить его для любого слоя / массива / настройки, которые он хочет

Проблемы: 1. Я могу только заставить стрелку указывать вверх, но она должна быть изменяемой.Я просмотрел код и портился с ним, но мои фундаментальные знания CG довольно низкие.2. Если я пытаюсь добавить дополнительные методы, все они должны быть вызваны из drawRect, поэтому любые альтернативы, вызываемые одновременно, которых у меня не может быть 3. Вероятно, некоторые общие недоразумения основной графики также мешают.

Кодовые биты до сих пор (я могу опубликовать весь код, но он немного длинный) В моем главном контроллере представления я объявляю экземпляр UIView, чтобы рисовать его при нажатии кнопки

(in mainViewController.m)

TipBallon *textExample = [[TipBallon alloc] initAtPoint:CGPointMake(50.0f, 50.0f) withText:
                          @"You are hearing me talk"];

И TipBallon UIView:

- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
CGContextRef contextRef = UIGraphicsGetCurrentContext();
[self drawOutlineInContext:contextRef];
[self drawTextInContext:contextRef];
}

- (id)initAtPoint:(CGPoint)point withText:(NSString *)string {
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:kFontSize]
                 constrainedToSize:CGSizeMake(kMaxWidth, kMaxHeight)
                     lineBreakMode:UILineBreakModeWordWrap];
CGRect rect = CGRectMake(point.x, point.y, size.width+kPaddingWidth*2.0f,
                         size.height+kPaddingHeight*2.0f+kArrowSize);
if ((self = [super initWithFrame:rect])) {
    self.text = string;
    UIColor *clearColor = [[UIColor alloc] initWithWhite:0.0f alpha:0.0f];
    self.backgroundColor = clearColor;
    [clearColor release];
}
return self;
}



- (void)drawOutlineInContext:(CGContextRef)context {
CGFloat HEIGHTOFPOPUPTRIANGLE = 15;
CGFloat WIDTHOFPOPUPTRIANGLE = 30;
CGFloat borderRadius = 7;
CGFloat strokeWidth = 2;
CGRect currentFrame = self.bounds;

CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineWidth(context, strokeWidth);
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);

// Draw and fill the bubble
CGContextBeginPath(context);
CGContextMoveToPoint(context, borderRadius + strokeWidth + 0.5f, strokeWidth + HEIGHTOFPOPUPTRIANGLE + 0.5f);
CGContextAddLineToPoint(context, round(currentFrame.size.width / 2.0f - WIDTHOFPOPUPTRIANGLE / 2.0f) + 0.5f, HEIGHTOFPOPUPTRIANGLE + strokeWidth + 0.5f);
CGContextAddLineToPoint(context, round(currentFrame.size.width / 2.0f) + 0.5f, strokeWidth + 0.5f);
CGContextAddLineToPoint(context, round(currentFrame.size.width / 2.0f + WIDTHOFPOPUPTRIANGLE / 2.0f) + 0.5f, HEIGHTOFPOPUPTRIANGLE + strokeWidth + 0.5f);
CGContextAddArcToPoint(context, currentFrame.size.width - strokeWidth - 0.5f, strokeWidth + HEIGHTOFPOPUPTRIANGLE + 0.5f, currentFrame.size.width - strokeWidth - 0.5f, currentFrame.size.height - strokeWidth - 0.5f, borderRadius - strokeWidth);
CGContextAddArcToPoint(context, currentFrame.size.width - strokeWidth - 0.5f, currentFrame.size.height - strokeWidth - 0.5f, round(currentFrame.size.width / 2.0f + WIDTHOFPOPUPTRIANGLE / 2.0f) - strokeWidth + 0.5f, currentFrame.size.height - strokeWidth - 0.5f, borderRadius - strokeWidth);
CGContextAddArcToPoint(context, strokeWidth + 0.5f, currentFrame.size.height - strokeWidth - 0.5f, strokeWidth + 0.5f, HEIGHTOFPOPUPTRIANGLE + strokeWidth + 0.5f, borderRadius - strokeWidth);
CGContextAddArcToPoint(context, strokeWidth + 0.5f, strokeWidth + HEIGHTOFPOPUPTRIANGLE + 0.5f, currentFrame.size.width - strokeWidth - 0.5f, HEIGHTOFPOPUPTRIANGLE + strokeWidth + 0.5f, borderRadius - strokeWidth);
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke);

- (void)drawTextInContext:(CGContextRef)context {
CGRect rect = self.bounds;
rect.origin.x += kPaddingWidth;
rect.origin.y += kPaddingHeight + kArrowSize;
rect.size.width -= kPaddingWidth*2.0f;
rect.size.height -= kPaddingHeight*2.0f;

CGContextSetGrayFillColor(context, 0.0f, 1.0f); // black text
[text drawInRect:rect withFont:[UIFont systemFontOfSize:kFontSize]
   lineBreakMode:UILineBreakModeWordWrap];
}

@end

Итак, как я уже говорил ранее, если я сделаю несколько версий текущего метода, который рисует прямоугольник со стрелкой вверх, мне нужно будет добавить его в метод drawRect, а затем все они будут вызваныв то же время.Единственный ход действий, который я вижу, - создать несколько разных классов, по одному для каждого направления стрелки, но это до смешного беспорядочно.Если у кого-то есть идеи, как обойти это, я был бы очень признателен

...