Центр UIImageView внутри UIScrollView без contentInset? - PullRequest
5 голосов
/ 18 сентября 2009

Мне не удалось найти ответ на этот вопрос, который у меня возник.

У меня есть UIImageView внутри UIScrollView, и я хотел бы центрировать его содержимое по вертикали.

Прямо сейчас, единственный способ, которым я смог сделать это, это установить contentInset представления прокрутки на основе высоты размера UIImageView, но это не идеальное решение; он просто увеличивает размер UIImageView, заставляя UIScrollView «думать», что его содержимое больше, и добавляет эти черные полосы вверху.

Я пытался получить помощь от:

UIScrollView с центрированным UIImageView, как приложение «Фотографии»

и

Центр содержимого UIScrollView, когда меньше

Но не смогли решить его, используя эти ответы.

Ответы [ 6 ]

6 голосов
/ 13 августа 2010

Этот код должен работать на большинстве версий iOS (и был протестирован на работу с версией 3.1 и выше, и это все, к чему у меня сейчас есть доступ).

Он основан на коде Apple WWDC, упомянутом в ответе Джоны.

Добавьте приведенное ниже в свой подкласс UIScrollView и замените tileContainerView видом, содержащим ваше изображение или плитки:

- (void)layoutSubviews {
    [super layoutSubviews];

    // center the image as it becomes smaller than the size of the screen
    CGSize boundsSize = self.bounds.size;
    CGRect frameToCenter = tileContainerView.frame;

    // center horizontally
    if (frameToCenter.size.width < boundsSize.width)
        frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
    else
        frameToCenter.origin.x = 0;

    // center vertically
    if (frameToCenter.size.height < boundsSize.height)
        frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
    else
        frameToCenter.origin.y = 0;

    tileContainerView.frame = frameToCenter;
}
4 голосов
/ 02 января 2010

Вы можете указать UIScrollView для прокрутки до определенного вида, вызвав scrollRectToVisible:animated:

Пример:

[myScrollView scrollRectToVisible:imageView.frame animated:YES];

Чтобы отцентрировать его по вертикали, попробуйте следующее:

1) Добавьте пустое представление к вашему просмотру прокрутки, которое соответствует высоте вашего содержимогоSize.

2) Добавьте ваш UIImageView к центру пустого ViewView

2) scrollRectToVisible в этом пусто просмотр.

1 голос
/ 20 июня 2010

Apple выпустила видео сессий WWDC 2010 для всех участников программы для разработчиков iphone. Одна из обсуждаемых тем - как они создали приложение для фотографий !!! Они шаг за шагом создают очень похожее приложение и сделали весь код бесплатным.

Он также не использует приватный API. Я не могу поместить здесь какой-либо код из-за соглашения о неразглашении, но здесь есть ссылка на пример загрузки кода. Вам, вероятно, понадобится войти, чтобы получить доступ.

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

И вот ссылка на страницу iTunes WWDC:

http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj

1 голос
/ 18 сентября 2009

Создайте отдельный uiview и добавьте UIImageView с центром в этом, затем добавьте представление в scrollview

UIView *view = [[UIVIew alloc] initWithFrame:<frame that will fill your scrollview>];
CGRect frame = CGRectMake((view.size.width - IMAGE_WIDTH)/2, (view.size.height - IMAGE_HEIGHT)/2, IMAGE_WIDTH, IMAGE_HEIGHT);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = [UIImage imageNamed:@"imageSized_IMAGE_WIDTH_by_IMAGE_HEIGHT.png"];
[view addSubview:imageView];
[imageView release];

[scrollView addSubview:view];
[view release];

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

0 голосов
/ 16 января 2010

contentInset не должен изменять contentSize, он должен изменять contentOffset.

Попробуйте установить contentSize, затем contentInset. Также обратите внимание на цвет фона UIScrollView и то, что может отображаться за ним. У меня нет проблем с центрированием UIImageView в UIScrollView, используя setContentSize, setContentInset и addSubview.

0 голосов
/ 15 января 2010

это может помочь

myImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;

http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/autoresizingMask

По сути, вы можете сделать с autoresizingMask то, что вы можете управлять «якорями» этого представления в его родительском представлении, как если бы вы использовали Interface Builder

...