iOS: масштабирование в TouchesMoved:

Внезапно вспомнив этим вечером учебник, который я прочитал давным-давно; речь шла о масштабировании вида вручную в 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,

Это поймало меня; В итоге я потратил часы, пытаясь найти это в Google, а также пытаясь выяснить, что послужило причиной того, что в границах CALayer содержится NaN: [0 0; нан 20].

Надеюсь, что кто-то может пролить на меня некоторый свет и объяснить мне подробно, что я сделал неправильно, и способы достичь того, что я хочу сделать здесь.

0 ответов

Другие вопросы по тегам