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].
Надеюсь, что кто-то может пролить на меня некоторый свет и объяснить мне подробно, что я сделал неправильно, и способы достичь того, что я хочу сделать здесь.