iOS:在TouchesMoved中缩放:

时间:2014-02-03 22:24:10

标签: ios objective-c touchesmoved scaletransform

突然想起了我很久以前读过的教程;它是关于在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

它抓住了我;我最终花了几个小时谷歌搜索试图做到这一点,并试图找出导致这个 CALayer界限包含NaN的原因:[0 0;南20]

希望有人能够对此有所了解并向我详细解释我做错了什么以及如何实现我想做的事情。

0 个答案:

没有答案