как заполнить сектор дуги правильно NSBezierPath, Цель-C

на моем приложении для таймера на Mac OS X я хочу отметить области своих часов с зеленым, желтым, оранжевым и красным цветом. См. снимок экрана ниже. И я хочу заполнить прошедшее время прозрачным серым.

But, as you can see at the screenshot, only the arc segment is filled. But I want the whole sector to be filled. The only thing I can do is [thePath fill];

Как всегда, я предполагаю, что делаю что-то не так. Но что?

enter image description here


Звонить

[self drawTheArcWithColor:path1  :liveAngle1  :[NSColor greenColor ]  :lineTheWidth];

Метод

- (void) drawTheArcWithColor:(NSBezierPath*) thePath :(CGFloat) angle :(NSColor*) theColor :(CGFloat) line {

    [thePath setLineWidth:line];
    [thePath appendBezierPathWithArcWithCenter:centerPoint  radius:2+circleHeight/2 startAngle:angle endAngle:angle+90.0f];

    [theColor setStroke];
    [[NSColor grayColor] setFill];
    [thePath fill];
    [thePath stroke];

}
2
nl ja de
Я don´ t видят то, что вы имеете в виду? Это - проблема?
добавлено автор Ronald Hofmann, источник
В документации Apple говорится, что это не обязательно. Почему должен я в таком сокращенном методе?
добавлено автор Ronald Hofmann, источник
@Zerd1984: круг в фоновом режиме - диаграмма и фиксированный. Красная цифра перемещается как вторая цифра часов остановки.
добавлено автор Ronald Hofmann, источник
Ну, я просто начинаю path1: NSBezierpath path1 = [NSBezierpath bezierPath]; иначе я получаю линию от существующего пути до начала path1. Я didn' t находят другой способ создать дугу.
добавлено автор Ronald Hofmann, источник
Можно ли показать нам, как вы создаете и заполняете остальную часть пути?
добавлено автор HashtagMarkus, источник
Как вы создаете path1? до сих пор я просто вижу, что вы создаете путь, который является только дугой
добавлено автор HashtagMarkus, источник
Необходимо действительно охватить Объективные-C имена методов...
добавлено автор Jonathan Grynspan, источник
Ваш метод называют -drawTheArcWithColor:::: . Это нужно назвать -drawArc:angle:color:lineWidth: или подобный.
добавлено автор Jonathan Grynspan, источник
Относительно обозначения вы должны называть его после соглашения для удобочитаемости. Если вы хотите получить Объективную-C помощь, хороший первый шаг не должен писать код, который выглядит чуждым людям, которые могут помочь вам. Если вы don' t хотят названные параметры для короткой процедуры, это - прекрасная возможность использовать нормальную функцию C, как: пустота drawArcWithColor (NSBezierPath *путь, угол CGFloat, NSColor *цвет, CGFloat lineWidth)
добавлено автор Quinn Taylor, источник

1 ответы

Необходимо начать путь в центральную точку, затем добавить сегмент дуги (неявно добавляющий линию от центральной точки до начала сегмента дуги) и наконец закрыть путь (создающий неявную линию из конца сегмента дуги к центральной точке).

- (void) drawTheArcWithColor:(NSBezierPath*) thePath :(CGFloat) angle :(NSColor*) theColor :(CGFloat) line {

   [thePath setLineWidth:line];
   [thePath moveToPoint:centerPoint];
   [thePath appendBezierPathWithArcWithCenter:centerPoint  radius:2+circleHeight/2 startAngle:angle endAngle:angle+90.0f];
   [thePath closePath];

   [theColor setStroke];
   [[NSColor grayColor] setFill];
   [thePath fill];
   [thePath stroke];

}
4
добавлено
Для заполняют путь частично прозрачным цветом, используют альфу компонент цвета: [[NSColor colorWithDeviceRed: 0.1f зеленый: 1.0f синий: 0.1f альфа: 0.4f] setFill]; .
добавлено автор Codo, источник
Ага, я понимаю, я должен потянуть сектор. Поскольку я просто создал дугу, только сегмент был заполнен:) Я могу сделать эти две линии от центра до начинания/заканчивания невидимого?
добавлено автор Ronald Hofmann, источник
Очень хороший намек, большое спасибо. Какая-либо идея, как сделать заполнение прозрачного?
добавлено автор Ronald Hofmann, источник
Все решенные проблемы, большое спасибо люди. Поздравления из Швейцарии, Рональд Хофман.
добавлено автор Ronald Hofmann, источник