Центр UIImageView внутри UIScrollView без contentInset?

Мне не удалось найти ответ на этот вопрос.

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

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

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

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

и

Центрировать содержимое UIScrollView при меньшем размере

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


person runmad    schedule 18.09.2009    source источник
comment
Я также изо всех сил пытаюсь найти решение для этого. Кажется, нет простого способа центрировать содержимое scrollView.   -  person Jonah    schedule 20.09.2009


Ответы (6)


Этот код должен работать в большинстве версий 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;
}
person JosephH    schedule 13.08.2010
comment
Я работаю над приложением для iPad и хочу центрировать изображение, показанное в DetailView. Я не создавал подклассы UIScrollView, вместо этого добавил этот код в shouldAutorotateToInterfaceOrientation, и теперь он хорошо работает как в альбомном, так и в портретном режимах. Спасибо, что поделился. - person Sushant; 19.01.2011

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

Пример:

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

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

1) Добавьте в свой scrollview пустой вид, который имеет ту же высоту, что и ваш contentSize.

2) Добавьте свой UIImageView в центр emptyView

2) scrollRectToVisible на этом пустом просмотре.

person bentford    schedule 02.01.2010

Создайте отдельный 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];

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

person coneybeare    schedule 18.09.2009
comment
Это вроде как сработает. Проблема в том, что если изображение меньше, чем UIView, оно будет частично прокручиваться за пределы экрана. Приложение для фотографий не позволяет этого, и выглядит намного лучше. - person Jonah; 20.09.2009
comment
Да, я видел проблему, о которой говорит Иона в некоторых приложениях. ЕДИНСТВЕННОЕ приложение, которое я видел, которое могло делать то, что мы хотим, правильно - это Apple Photos.app :( Пока я просто центрирую свое изображение внутри UIView, а затем размер изображения + любые вставки, которые мне нужны, чтобы оно было центрировано внутри UIScroolView. Не оптимально, так как он добавляет черные полосы вверху и внизу. Выглядит немного лучше, если я уберу полосы прокрутки (например, Photos.app) - person runmad; 21.09.2009

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

person Jonah    schedule 20.06.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

person Camilo Sanchez    schedule 15.01.2010

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

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

person David Kanarek    schedule 16.01.2010