で構成されるグラフィックがありCGMutablePaths
ます。私はこれらを取り、それらが表すグラフィックのさまざまな領域に基づいてCGMutablePaths
それらを分離しています。CAShapeLayers
以下は、これを実現するために使用するコードのスニペットです。
_initialSize = _size = CGSizeMake(168.784,127.842);
CGRect shapeLayerFrame = CGRectMake(0, 0, _initialSize.width, _initialSize.height);
CAShapeLayer *eyeBallShapeLayer = [[CAShapeLayer alloc] init];
eyeBallShapeLayer.fillColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1].CGColor;
eyeBallShapeLayer.bounds = shapeLayerFrame;
CGMutablePathRef eyeBallMutablePath = CGPathCreateMutable();
CAShapeLayer *eyeWhiteShapeLayer = [[CAShapeLayer alloc] init];
eyeWhiteShapeLayer.fillColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor;
eyeWhiteShapeLayer.bounds = shapeLayerFrame;
CGMutablePathRef eyeWhiteMutablePath = CGPathCreateMutable();
CGMutablePathRef mutablePath;
mutablePath = CGPathCreateMutable();
CGPathMoveToPoint(mutablePath, NULL, 168.78,127.79);
CGPathAddLineToPoint(mutablePath, NULL, 155.56,127.13);
CGPathAddCurveToPoint(mutablePath, NULL, 156.23,126.83,156.73,125.92,157.06,125.31);
CGPathAddCurveToPoint(mutablePath, NULL, 157.60,122.36,157.84,119.11,159.77,116.67);
CGPathAddCurveToPoint(mutablePath, NULL, 160.75,115.23,160.44,113.42,160.52,111.78);
CGPathAddCurveToPoint(mutablePath, NULL, 160.58,111.83,160.64,111.88,160.70,111.94);
CGPathAddCurveToPoint(mutablePath, NULL, 161.05,112.27,161.27,112.68,161.47,113.10);
CGPathAddCurveToPoint(mutablePath, NULL, 161.63,113.46,161.78,113.82,161.96,114.16);
CGPathAddCurveToPoint(mutablePath, NULL, 161.97,114.18,161.98,114.20,161.99,114.21);
CGPathAddCurveToPoint(mutablePath, NULL, 162.13,114.47,162.29,114.71,162.51,114.92);
CGPathAddLineToPoint(mutablePath, NULL, 162.52,114.92);
CGPathAddCurveToPoint(mutablePath, NULL, 162.96,115.28,163.36,115.65,163.74,116.05);
CGPathAddCurveToPoint(mutablePath, NULL, 165.44,117.86,166.53,120.17,167.18,122.59);
CGPathAddCurveToPoint(mutablePath, NULL, 167.25,122.86,167.32,123.13,167.38,123.40);
CGPathAddCurveToPoint(mutablePath, NULL, 167.63,124.48,167.79,125.58,167.89,126.67);
CGPathAddCurveToPoint(mutablePath, NULL, 167.90,126.94,168.05,127.13,168.23,127.30);
CGPathAddCurveToPoint(mutablePath, NULL, 168.41,127.47,168.63,127.62,168.78,127.79);
CGPathCloseSubpath(mutablePath);
CGPathAddPath(eyeBallMutablePath, NULL, mutablePath);
CGPathRelease(mutablePath);
//a whole lot of paths being loaded in much the same way as above
_shapeLayers = [[NSMutableArray alloc] init];
eyeBallShapeLayer.path = eyeBallMutablePath;
[_shapeLayers addObject:eyeBallShapeLayer];
CGPathRelease(eyeBallMutablePath);
[eyeBallShapeLayer release];
eyeWhiteShapeLayer.path = eyeWhiteMutablePath;
[_shapeLayers addObject:eyeWhiteShapeLayer];
CGPathRelease(eyeWhiteMutablePath);
[eyeWhiteShapeLayer release];
これらの shapeLayers をビューlayer
プロパティにアタッチすると、グラフィックがうまく描画されます。私が得ている問題は、CAShapeLayers
アニメーションが発生したときに自分自身を再描画していることです。IE モーダル ビューがプルアップされた場合、またはナビゲーション トランジションがある場合、それ自体が再描画されます。ユーザーが画面をタップすると(写真アプリのように)バーが消え、その間に再描画される機能があります。シェイプをドラッグすると、それ自体も再描画されます。かなりの量のパスがある私のグラフィックの一部では、それ自体を再描画しているときにアニメーションが途切れます。
だから私の質問は、なぜこれが起こっているのか誰か知っていますか? これが起こる原因は何ですか?これは、drawRect で単純にグラフィックを描画していたときには発生していなかったので、少し混乱しています。