突然想起今天晚上我很久以前读过的一个教程;它是关于在委托方法中手动缩放视图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 点),我想检查视图是否缩放小于阈值或缩放大于其父框架,因为我想得到首先缩放部分。
但是这里的缩放并不成功(我从未见过任何缩放,视图会“闪烁”消失)。有时它被缩放到一个点,我什至会出现黑屏(但不会导致崩溃,应用程序仍然运行。在极少数情况下,当我尝试缩放时,我什至会得到一个包含 NaN 的 CALayer 边界:[0 0 ; nan 20]异常 <<== 第一次看到这个异常)。
我认为这里的问题是一个数学问题。我没有问题CGAffineTransformMakeScale
,我尽量不使用它,因为我想尝试做同样的事情,只使用bounds
.
它抓住了我;我最终花了几个小时在谷歌上搜索试图做到这一点,并试图找出导致这个CALayer 边界包含 NaN 的原因:[0 0; 南 20]。
希望有人能让我对此有所了解,并向我详细解释我做错了什么以及实现我想要在这里做的事情的方法。