0

ImageView色を選択するための円形グラデーションをレンダリングするために を使用しています。

問題は、私が長方形のpanGestureRecognizer中にいる限り、円形のグラデーションの外にいても色を返し続けることです。 ImageView

循環境界を強制する方法はありますか?

グラデーションを に追加するコードは次のImageViewとおりです。

CGSize size = CGSizeMake(self.view.bounds.size.width, ((self.view.bounds.size.height)/2));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(size.width, size.height), YES, 0.0);
[[UIColor whiteColor] setFill];
UIRectFill(CGRectMake(0, 0,size.width,size.height));


int sectors = 180;
float radius = MIN(size.width, size.height)/2;
float angle = 2 * M_PI/sectors;
UIBezierPath *bezierPath;
for ( int i = 0; i < sectors; i++)
{
    CGPoint center = CGPointMake(((size.width)/2), ((size.height)/2));
    bezierPath = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:i * angle endAngle:(i + 1) * angle clockwise:YES];
    [bezierPath addLineToPoint:center];
    [bezierPath closePath];
    UIColor *color = [UIColor colorWithHue:((float)i)/sectors saturation:1. brightness:1. alpha:1];
    [color setFill];
    [color setStroke];
    [bezierPath fill];
    [bezierPath stroke];
}
img = UIGraphicsGetImageFromCurrentImageContext();
gradientView = [[UIImageView alloc]initWithImage:img];;
4

1 に答える 1

0

タッチが仮想円の内側にあるかどうかを確認する必要があります。

必要なのは、かなり基本的な三角法だけです。タッチ ポイントとビューの中心の間の距離を計算する必要があります。その距離が colorView の半径よりも大きい場合、新しい色に変更せずに戻りたい (または colorView の端にある値を設定する)

色相と彩度のピッカーには、このようなものを使用します。

- (void)gestureRecognizerDidPan:(UIPanGestureRecognizer *)gesture {
    CGFloat saturation = 0.0f;
    CGFloat hue = 0.0f;

    UIView *colorView = gesture.view;
    CGPoint location = [gesture locationInView:colorView];

    // we assume that the colored area is a circle inside of a square rect
    CGPoint colorViewCenter = CGPointMake(ceilf(CGRectGetWidth(colorView.bounds)/2.0f), ceilf(CGRectGetHeight(colorView.bounds)/2.0f));
    CGFloat colorViewRadius = floorf(CGRectGetWidth(colorView.bounds)/2.0f);

    CGFloat dx = location.x - colorViewCenter.x;
    CGFloat dy = location.y - colorViewCenter.y;
    CGFloat touchRadius = sqrtf(powf(dx, 2)+powf(dy, 2));
    if (touchRadius > colorViewRadius) {
        // touch was outside of circular area

        // set saturation to max
        saturation = 1.0f;

        // or: 
        // return;
    }
    else {
        saturation = touchRadius / colorViewRadius;
    }

    CGFloat angleRad = atan2f(dx, dy);
    CGFloat angleDeg = (angleRad * (180.0f/M_PI) - 90);
    if (angleDeg < 0.f) {
        angleDeg += 360.f;
    }
    hue = angleDeg / 360.0f;

    // tell your target
}
于 2013-07-15T09:09:46.027 に答える