今晩、ずっと前に読んだチュートリアルを突然思い出しました。デリゲート メソッドでビューを手動でスケーリングすることについてだったUIResponder
ので、楽しみのために記憶から繰り返してみようと思いました。
チュートリアルCAffineTransformMakeScale
は私の記憶が役立つ限り適用され、私はそれなしでこれを行い、bounds
スケーリングしようとしているビューのみを利用すると思いました。
私が達成したいこと:
1.)ピンチでビューを拡大縮小します(を使用しませんCGAffineTransformMakeScale
)。スケーリングは、ビューの隅からではなく、ビューの「中央」から行う必要があります。
2.)派生したスケール値が < 0.0f の場合、ビューがスケールされないようにします。
3.)親のフレームの外にあるビューが大きくなりすぎないようにします。
私はすぐに次のことを思いつきましたが、うまくいきません:
myView = [[UIView alloc] initWithFrame:(CGRect){{0, 0}, 150, 150}];
myView.center = (CGPoint){CGRectGetWidth(self.view.frame)/2, CGRectGetHeight(self.view.frame)/2};
CGPoint initialDistance;
CGPoint endDistance;
CGFloat delta;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if([touches count] > 1)
{
initialDistance = (CGPoint){[[[touches allObjects] objectAtIndex:0] locationInView:self.view].x - [[[touches allObjects] objectAtIndex:1] locationInView:self.view].x,
[[[touches allObjects] objectAtIndex:0] locationInView:self.view].y - [[[touches allObjects] objectAtIndex:1] locationInView:self.view].y};
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if([touches count] > 1)
{
endDistance = (CGPoint){[[[touches allObjects] objectAtIndex:0] locationInView:self.view].x - [[[touches allObjects] objectAtIndex:1] locationInView:self.view].x,
[[[touches allObjects] objectAtIndex:0] locationInView:self.view].y - [[[touches allObjects] objectAtIndex:1] locationInView:self.view].y};
delta = sqrtf(powf((endDistance.x - initialDistance.x), 2) + powf((endDistance.y - initialDistance.y), 2));
delta = delta * 0.01f;
myView.bounds = (CGRect){{myView.bounds.origin.x / delta, myView.bounds.origin.y / delta}, myView.bounds.size.width * delta, myView.bounds.size.height * delta};
}
}
ここでは、最初に述べた部分 (ポイント 2 と 3) を実装していません。ここでは、ビューがしきい値よりも小さくスケーリングされているかどうか、または親のフレームよりも大きくスケーリングされているかどうかを確認します。最初にスケーリング部分。
しかし、ここでのスケーリングは成功しません (スケーリングを見たことがなく、ビューが「点滅」してしまいます)。時々、黒い画面が表示されるところまでスケーリングされます (ただし、クラッシュは発生しませんが、アプリは引き続き実行されます。スケーリングしようとすると、まれに、CALayer の境界に NaN が含まれていることさえあります: [0 0] ; nan 20]例外 <<== この例外を初めて見た)。
ここでの問題は数学的なものだと思います。を使っても問題ありませCGAffineTransformMakeScale
んが、 だけを使って同じことをやってみたいので使わないようにしましたbounds
。
それは私を捕まえました。私はこれを行うためにグーグルで何時間も費やし、また、この CALayer 境界に NaN が含まれている原因を突き止めようとしました: [0 0; ナン20]。
誰かがこれについて私に光を当て、私が間違ったことと、ここでやりたいことを達成する方法を詳細に説明してくれることを願っています.