Кольцо кругов внутри круга, динамического размера - PullRequest
2 голосов
/ 05 мая 2011

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

Я пытаюсь создать класс окружности, который динамически создает кольцо окружностей внутри круга, иУ меня проблемы с триггером за всем этим.Идея состоит в том, чтобы создать изображение для поворотного телефона, но я хочу иметь возможность повторно использовать этот класс для других похожих изображений (круги для загрузки изображений и т. Д.).

Из моего контроллера представления я вызываю CustomCircleView,и это создает базовый круг в порядке (я использую этот круг для цвета фона, так что я могу настроить его оттенок отдельно).Затем я вызываю мой класс DialView, который также хорошо создает базовый круг, но мои вырезы не отображаются там, где я ожидаю.

Я хочу, чтобы у меня было 12 равномерно распределенных кругов, и чтобы они были прозрачнымииспользуя EOFill.EOFill работает правильно, и все отображается без ошибок, но мои круги не отображаются там, где я их ожидаю;скорее всего, это означает, что с моей математикой что-то не так.

Вот соответствующий код:

- (void)drawRect:(CGRect)rect
{
    int inset = 2;  // space between cutouts and edge of dial
    int circleDiameter = self.bounds.size.width - inset * 2;
    float circleRadius = circleDiameter / 2;
    float holeDiameter = circleDiameter * 0.15;  // wrong size; is there a formula for this?
    float holeRadius = holeDiameter / 2;
    int holePadding = 2;  // space between cutouts
    float hypotenuse = circleRadius - holeRadius - holePadding;
    float dispX;
    float dispY;

    // Set context.
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Set line stroke parameters.
    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor);
    CGContextSetFillColorWithColor(context, self.dialColor.CGColor);

    // main dial circle; this will remain visible
    CGRect ellipse = CGRectMake(self.bounds.origin.x + inset, self.bounds.origin.y + inset, circleDiameter, circleDiameter);
    CGContextAddEllipseInRect(context, ellipse);

    // grid for debugging; remove once circles line up properly
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height);
    CGContextMoveToPoint(context, 0, self.bounds.size.height);
    CGContextAddLineToPoint(context, self.bounds.size.width, 0);
    CGContextStrokePath(context);

    // circle spacing based on 12 circles
    // hole diameter should be proportional to that of dial diameter

    // 1
    dispX = (self.bounds.size.width / 2)  + (cosf(45) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) - (sinf(45) * hypotenuse) - (holeRadius);
    CGRect hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 2
    dispX = (self.bounds.size.width / 2)  + (cosf(75) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) - (sinf(75) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 3
    dispX = (self.bounds.size.width / 2)  - (cosf(75) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) - (sinf(75) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 4
    dispX = (self.bounds.size.width / 2)  - (cosf(45) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) - (sinf(45) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 5
    dispX = (self.bounds.size.width / 2)  - (cosf(15) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) - (sinf(15) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 6
    dispX = (self.bounds.size.width / 2)  - (cosf(15) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) + (sinf(15) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 7
    dispX = (self.bounds.size.width / 2)  - (cosf(45) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) + (sinf(45) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 8
    dispX = (self.bounds.size.width / 2)  - (cosf(75) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) + (sinf(75) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 9
    dispX = (self.bounds.size.width / 2)  + (cosf(75) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) + (sinf(75) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);

    // 0
    dispX = (self.bounds.size.width / 2)  + (cosf(45) * hypotenuse) - (holeRadius);
    dispY = (self.bounds.size.height / 2) + (sinf(45) * hypotenuse) - (holeRadius);
    hole = CGRectMake(dispX, dispY, holeDiameter, holeDiameter);
    CGContextAddEllipseInRect(context, hole);


    CGContextEOFillPath(context);
}

1 Ответ

0 голосов
/ 08 мая 2011

Разобрался.Я использовал градусы с функциями триггера, а не радианами.

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

...