Несколько динамических запросов на отрисовку iPhone

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

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

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

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

(in mainViewController.m)

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

И UIView TipBallon:

- (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, и тогда все они будут вызываться одновременно. Единственный выход, который я вижу, это создать несколько разных классов, по одному для каждого направления стрелки, но это до смешного беспорядочно. Если у кого-то есть идеи, как это обойти, буду очень признателен


person Elmo    schedule 07.07.2011    source источник