2013-02-26 4 views
4

Будучи новичком в чертеже iOS, я хотел нарисовать небольшой контейнер для всплывающих подсказок, который состоит из прямоугольника со стрелкой индикатора. Я создал 2 UIBezierPaths и присоединился к ним с помощью «appendPath». Я думал, что это был правильный путь, но после битвы в течение 1 дня мне пришлось обратиться за помощью. Вот скриншот, где я сейчас нахожусь:Присоединился к моменту UIBezierPath в целом

Screenshot of UIBezierPath

Как вы можете видеть, что проблема просто, что, когда я пытаюсь погладить присоединился путь, он не получает погладил в целом, но, как отдельный штук. Возможно, кто-то может указать мне в правильном направлении, чтобы решить это?

Вот код:

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // create indicator path 
    UIBezierPath *indicator = [[UIBezierPath alloc] init]; 
    // corner radius 
    CGFloat radius = self.cornerRadius; 
    // main path 
    UIBezierPath *path; 
    // format frame 
    rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height - self.indicatorSize.height); 
    // assign path 
    path = [UIBezierPath bezierPathWithRoundedRect: rect 
           byRoundingCorners:UIRectCornerAllCorners 
             cornerRadii:CGSizeMake(radius, radius)]; 
    // x point 
    CGFloat x = (rect.size.width - self.indicatorSize.width)/2; 

    [indicator moveToPoint:CGPointMake(x, rect.size.height)]; 
    [indicator addLineToPoint:CGPointMake(x + self.indicatorSize.width/2, rect.size.height + self.indicatorSize.height)]; 
    [indicator addLineToPoint:CGPointMake(x + self.indicatorSize.width, rect.size.height)]; 
    // close path 
    [indicator closePath]; 
    // append indicator to main path 
    [path appendPath:indicator]; 

    [[UIColor redColor] setStroke]; 
    [path setLineWidth:2.0]; 
    [path stroke]; 
    [self.fillColor setFill]; 
    [path fill]; 
    // release indicator 
    [indicator release]; 
} 

Заранее спасибо

ответ

6

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

Из документации Apple, UIBezierPath:

[appendPath:] добавляет команды, используемые для создания пути в bezierPath к концу пути приемника. Этот метод явно не пытается подключить подпапки в двух объектах, хотя операции в bezierPath могут все еще вызвать этот эффект.

Итак, сначала он будет рисовать прямоугольник, а затем он будет использовать свой треугольник, не пытаясь присоединиться к ним

+0

Привет. Спасибо за подсказку, однако я попробовал, и хотя он работает, он рисует двойную границу на нижней границе, я не знаю, почему вы можете проверить это здесь: http://oi51.tinypic.com/2cxevmd.jpg , И вот новый код, который я рисую: http://pastebin.com/imcvhGdQ. Я делаю что-то неправильно? – Hidden

+0

Попробуйте начать рисование на 0,5,0,5, чтобы избежать рисования на половине пикселей: см. Это для более подробной информации http://www.cocoabuilder.com/archive/cocoa/204399-drawing-1-pixel-perfect-wide-bordered-nsbezierpath .html – iain

+0

Я ответил на это здесь с изображением: http://stackoverflow.com/a/15097830/210171 – nielsbot

Смежные вопросы