Как повернуть UIImageView на 90 градусов внутри UIScrollView с правильным размером изображения и прокруткой? - PullRequest
5 голосов
/ 16 февраля 2011

У меня есть изображение внутри UIImageView, который находится внутри UIScrollView. То, что я хочу сделать, это повернуть это изображение на 90 градусов, чтобы оно было по умолчанию в горизонтальной ориентации, и установить начальный масштаб изображения так, чтобы все изображение вписывалось в вид прокрутки, а затем позволить ему увеличить до 100% и обратно снова до минимального увеличения.

Это то, что я имею до сих пор:

self.imageView.transform = CGAffineTransformMakeRotation(-M_PI/2);

float minimumScale = scrollView.frame.size.width  / self.imageView.frame.size.width;  
scrollView.minimumZoomScale = minimumScale;  
scrollView.zoomScale = minimumScale;  


scrollView.contentSize = CGSizeMake(self.imageView.frame.size.height,self.imageView.frame.size.width);

Проблема в том, что, если я установил преобразование, в просмотре прокрутки ничего не появится. Однако, если я закомментировал преобразование, все работает, кроме изображения не в альбомной ориентации, как я хочу!

Если я применяю преобразование и удаляю код, который устанавливает свойства minimalZoomScale и zoomScale, тогда изображение отображается в правильной ориентации, однако с неправильным zoomScale и кажется, что свойство contentSize также установлено неправильно - поскольку не прокручивается к краю изображения влево / вправо, но сверху и снизу, но больше по краю.

Примечание: изображение загружается с URL-адреса

Ответы [ 5 ]

19 голосов
/ 16 февраля 2011

Возможно, вращение самого изображения соответствует вашим потребностям:

3 голосов
/ 11 мая 2012

Я считаю, что самый простой способ (и потокобезопасность тоже) заключается в следующем:

//assume that the image is loaded in landscape mode from disk
UIImage * LandscapeImage = [UIImage imageNamed: imgname];
UIImage * PortraitImage = [[UIImage alloc] initWithCGImage: LandscapeImage.CGImage
                                                     scale: 1.0
                                               orientation: UIImageOrientationLeft];
2 голосов
/ 24 ноября 2012

Существует гораздо более простое и быстрое решение, просто сделайте это:

- (void) imageRotateTapped:(id)sender
{
    [UIView animateWithDuration:0.33f animations:^()
    {
        self.imageView.transform = CGAffineTransformMakeRotation(RADIANS(self.rotateDegrees += 90.0f));
        self.imageView.frame = self.imageView.superview.bounds; // change this to whatever rect you want
    }];
}

Когда пользователь закончит, вам нужно будет создать новое повернутое изображение, но это очень легко сделать.

2 голосов
/ 16 февраля 2011

Любые вычисления, которые вы делаете на основе фрейма imageView, вероятно, должны быть выполнены до того, как вы примените к нему какие-либо преобразования.Но я бы на самом деле предложил делать эти расчеты на основе размера UIImage, а не UIImageView.Затем установите как кадр UIImageView, так и contentSize UIScrollView, основываясь на этом.

Предложение Макса хорошее, хотя при увеличении изображения это может привести к снижению производительности.Отображаете ли вы это изображение из ресурсов вашего приложения?Если так, то почему бы просто не повернуть изображения, прежде чем вы даже создадите приложение?

0 голосов
/ 22 января 2013

Я использовал принятый ответ некоторое время, пока мы не заметили, что неквадратные повороты, основанные на изображениях, снятых непосредственно с камеры, выглядели растянутыми (они вращались по желанию, только ширина / высота кадра не регулировалась).

Отличное объяснение / пост от Тревора: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

В конце концов, это был очень простой импорт кода Тревора, который использует категории для добавления метода resizedImage:interpoationQuality в UIImage. Так что да, пользователь остерегается, если он все еще работает для вас, отлично. Но если это не так, я бы взглянул на библиотеку.

...