UIImageView / UIScrollView, заставляющий фиксированное соотношение сторон соответствовать размеру экрана - PullRequest
10 голосов
/ 08 февраля 2011

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

Это изображение помещается в UIImageView, который затем помещаетсявнутри UIScrollView.

Навигация и масштабирование работают на 100%;однако изображение загружается с фиксированным соотношением сторон, чтобы соответствовать экрану, и никогда не изменится (даже при увеличении).

У меня такое ощущение, что Interface Builder устанавливает какое-то свойство, которое яне знаю, но я попробовал все, что мог придумать, чтобы это исправить.

Проблема:

Когда приложение изначально загружается, содержимое внутриUIScrollView автоматически изменяется в соответствии с размером экрана iPad, изменяя соотношение сторон ./fixed;фактическое изображение гигантское (намного больше, чем разрешение iPad).Это масштабированное соотношение сторон сохраняется даже при увеличении изображения и приводит к тому, что изображение выглядит растянутым.

Независимо от того, что я пытаюсь, я не могу остановить iPad от автоматического масштабирования моего изображения.Я просто хочу, чтобы приложение запускалось с моим изображением, отображаемым на iPad в нормальном режиме (с увеличением 100%), а верхний левый угол изображения - это часть, которая в настоящее время помещается на экране iPad.То, что я пытался это исправить:

Я пытался изменить UIImageView's режим содержимого в Интерфейсном Разработчике на «Слева вверху».Казалось, это работает отлично, но потом я понял, что UIScrollView не позволит вам прокручивать изображение мимо первоначально отображаемой части (вверху слева).Вы можете увеличивать верхнюю левую часть и прокручивать, но никогда не превышать то, что первоначально отображалось на экране.

Код:

Вот код, который яиспользую для настройки просмотров.imageScrollView - это UIScrollView, а imageView - это UIImageView.Они оба IBOutlets.

   // Set the needed attributes of the imageView
    [imageView setImage:[UIImage imageNamed: @"TestImage.png"]];
    imageView.userInteractionEnabled = YES;

    // Set a bunch of the imageScrollView attributes.

    // calculate minimum scale to perfectly fit image width, and begin at that scale
    float minimumScale = [imageScrollView frame].size.width  / [imageView frame].size.width;
    [imageScrollView setMinimumZoomScale:minimumScale];
    [imageScrollView setZoomScale:1];
    [imageScrollView setMaximumZoomScale:10];
    [imageScrollView setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)];
    [imageScrollView setScrollEnabled:YES];
    [imageScrollView setUserInteractionEnabled:YES];
    imageScrollView.clipsToBounds = YES;
    imageScrollView.bounces = FALSE;
    imageScrollView.bouncesZoom = FALSE;

У меня также есть два UIGestureRecongizers, чтобы справиться с масштабированием, но я не верю, что они являются проблемой.Когда я их комментирую, ничего не меняется.

Любая помощь будет чрезвычайно оценена.

Ответы [ 4 ]

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

Я это исправил!

Для тех, у кого есть такая же проблема, вот как я исправил код:

Причиной ошибки было то, что Interface Builder заставлял представления использовать ScaleToFill contentMode. Установка ScrollView's contentMode в UIViewContentModeScaleAspectFit не сработала сама по себе, поскольку imageView все еще искажался.

Исправление:

Следующий код необходимо было добавить в конце настройки для UIScrollView и UIImageView (внутри метода viewDidLoad()):

    [imageScrollView setContentMode:UIViewContentModeScaleAspectFit];
    [imageView sizeToFit];
    [imageScrollView setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)];

Пояснение:

Сначала UIScrollView's contentMode устанавливается на AspectFit, как предложено @Mike. Затем sizeToFit () вызывается на imageView, чтобы переопределить надоедливые предустановки Interface Builder и сделать изображение нужного размера.

Последняя строка важна. Вы должны установить contentSize для ScrollView ПОСЛЕ изменения размера imageView. В противном случае ScrollView будет думать, что изображение по-прежнему соответствует размеру дисплея iPad, и поэтому не будет думать, что есть что прокручивать. Установка размера ScrollView после изменения размера ImageView и изменения ScrollView's contentMode делает ScrollView фактическим размером изображения.

Надеюсь, это помогло!

Спасибо за помощь, Майк, это помогло мне встать на правильный путь:)

  • Alex
1 голос
/ 09 февраля 2011

Поскольку imageView является содержимым прокрутки, попробуйте изменить режим содержимого ScrollView's на UIViewContentModeScaleAspectFit.Попробуйте позвонить setNeedsDisplay на imageview.

0 голосов
/ 02 сентября 2016

Этот код работал для меня: (Swift)

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let imgView = UIImageView(image: UIImage(named: "MyImage"))
    imgView.contentMode = .ScaleAspectFit
    var size = imgView.frame.size
    size.height = size.height / size.width * scrollView.frame.width
    size.width = scrollView.frame.width
    imgView.frame.size = size
    scrollView.addSubview(imgView)
    scrollView.contentSize = size
}
0 голосов
/ 23 мая 2014

Для тех, кто изо всех сил пытается исправить аспект изображения в ландшафтном режиме при использовании UICollectionView, когда требуется изображение в полноэкранном режиме.

В вашем - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath выполните следующие действия:

CGFloat newWidth = self.view.bounds.size.width; //if iPad in landscape and fullscreen value is 1024
CGFloat newHeight = image.size.height / image.size.width * newWidth;

cell.clipsToBounds = YES;
cell.imageView.frame = CGRectMake(0, 0, newWidth, newHeight);
cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
cell.imageView.image = image;
cell.scrollView.contentSize = cell.imageView.frame.size;

Главное, чтобы рамка просмотра изображения имела правильный размер при сохранении правильного соотношения сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...