1

こんにちは、私はUIScrollViewでUIImageViewを使用しているiPadアプリを作成しています。そのため、画像をズームして何かを描画しようとすると、タッチしたポイントに描画されません。どのくらいズームすると、描画に違いが生じ、中央ではなく左上隅に画像が作成されます。みんな私に提案します。ここに私のコードがあります

if (isFreeHand==YES) {
    mouseSwiped = YES;
    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self];
    self.frame = CGRectIntegral(self.frame);

    UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, 0.0);

    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x-mWidht, lastPoint.y-mHeight);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x-mWidht, currentPoint.y-mHeight);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
     self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempDrawImage setAlpha:opacity];
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
}
4

2 に答える 2

0

画像が拡大縮小されると、実際よりも大きく表示されます。原点が (0,0) ではない可能性があります。したがって、タッチの実際の位置を再計算する必要があります。

明確にするために:

zoom scale ... zs
image offset ... (oX,oY)
touch coordinates ... (tX,tY)
translated touch ... (rtX,rtY)

ズームされた画像の原点がまだ (0,0) にある場合、次のように touch を変換します。

rtX = tX/zs; 
rtY = tY/zs;

画像の原点がオフセット (oX、oY) だけオフ (0,0) で、ズームスケールが 1.0 の場合、次のように touch を変換します。

rtX = tX+oX;
rtY = tY+oY;

すべてをまとめると (オフセットとズーム)、翻訳は次のようになります。

rtX = oX + tX/zs; //with oX zoomscale is allready taken into account
rtY = oY + tY/zs; //with oY zoomscale is allready taken into account

これらの計算はテストしていないため、完全に正しくない可能性があることに注意してください。しかし、彼らはあなたを始めるべきです。

問題に対するより洗練された (組み込みの) 解決策があるかもしれません。

于 2013-09-21T13:06:17.697 に答える
0

4 行目selfで、UIImageView の名前に置き換えます。

CGPoint currentPoint = [touch locationInView: self.tempDrawImage];

locationInView は、実際には特定の UIView を基準としたタッチの座標を作成します。これはまさに必要なものです。

于 2014-09-24T19:26:31.870 に答える