У меня есть простое приложение, в котором я присоединяю UIPinchGestureRecognizer и UIPanGestureRecognizer к imageView, чтобы я мог перетаскивать и масштабировать его. Я сделал это так, чтобы imageView можно было частично убрать с экрана и свернуть с дисплея, но небольшая 75-пиксельная часть изображения остается на дисплее, поэтому изображение можно перетаскивать обратно на него. Так, например, если я попытаюсь перетащить imageView из правой части экрана, он остановится, когда останется 75 пикселей imageView, оставляя достаточно места для меня, чтобы перетащить его обратно. То же самое относится и к масштабированию, создаваемый мной граничный кадр предотвращает сворачивание изображения с экрана.
Во всяком случае, у меня возникла эта проблема с моим кодом границы в методе делегата UIPinchGestureRecognizer. То, как я делаю границы, я создаю кадр, который является копией суперпредставления imageViews, за исключением того, что он выдвигается в 75 пикселей с каждой стороны, сверху и снизу. Я проверяю, не пересекается ли imageView с этим кадром, и затем я знаю, что он достиг одной из границ справа / слева или сверху / снизу. Это работает по большей части, однако, когда я увеличиваю изображение до довольно большого размера (обычно где-то более 1000 на 1000), граница не работает - если я делаю сверхбыстрый масштаб, изображение полностью исчезает с экрана. поэтому я не могу перетащить его обратно.
Мне просто интересно, почему это происходит. Связано ли это с тем, что размер изображения становится слишком большим? Или это недостаток в моем коде? (Я перечислил ниже). Если кто-то может помочь, будет признателен.
- (void)scale:(UIPinchGestureRecognizer *)sender
{
if([sender state] == UIGestureRecognizerStateBegan)
{
lastScale = [sender scale];
}
if ([sender state] == UIGestureRecognizerStateBegan ||
[sender state] == UIGestureRecognizerStateChanged)
{
CGFloat currentScale = [[[sender view].layer valueForKeyPath:@"transform.scale"] floatValue];
CGFloat newScale = 1 - (lastScale - [sender scale]);// * (CropThePhotoViewControllerPinchSpeed);
newScale = MAX(newScale, CropThePhotoViewControllerMinScale / currentScale);
CGFloat scaledWidth = newScale * sender.view.frame.size.width;
CGFloat scaledHeight = newScale * sender.view.frame.size.height;
CGRect translatedRect = CGRectMake(sender.view.frame.origin.x, sender.view.frame.origin.y, scaledWidth, scaledHeight);
CGRect boundaryRect = CGRectMake(sender.view.superview.frame.origin.x + CropThePhotoViewControllerBoundaryBuffer, sender.view.superview.frame.origin.y + CropThePhotoViewControllerBoundaryBuffer, sender.view.superview.frame.size.width - (CropThePhotoViewControllerBoundaryBuffer * 2), sender.view.superview.frame.size.height - (CropThePhotoViewControllerBoundaryBuffer * 2));
if (!(!CGRectIntersectsRect(boundaryRect,translatedRect) && newScale < 1))
{
CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
[[sender view] setTransform: transform];
lastScale = [sender scale];;
}
}
}