突然想起了我很久以前读过的教程;它是关于在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点),我想检查视图的缩放是否小于阈值,或者当它的缩放比其父级的帧大时,因为我会喜欢先缩放部分。
但是这里的缩放并不成功(我从未看到任何缩放,视图会“眨眼”)。有时它被缩放到一个点我甚至会得到一个黑屏(但不会导致崩溃,但是,App仍然运行。在极少数情况下,当我尝试扩展时,我甚至会得到一个 CALayer界限包含NaN: [0 0; nan 20] 异常<< = =第一次见到这个异常。)
我认为这里的问题是数学。我使用CGAffineTransformMakeScale
没有问题,我试图不使用它,因为我想尝试只使用bounds
。
希望有人能够对此有所了解并向我详细解释我做错了什么以及如何实现我想做的事情。