2009-09-18 4 views
5

Мне не удалось найти ответ на этот вопрос, который у меня есть.Центр UIImageView внутри UIScrollView без содержимогоInset?

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

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

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

UIScrollView with centered UIImageView, like Photos app

и

Center content of UIScrollView when smaller

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

+0

Я также изо всех сил, чтобы найти исправление для этого. Кажется, нет простого способа сосредоточиться на содержании scrollView. – Jonah

+0

Был ли еще дан ответ? – JoePasq

ответ

1

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

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

+0

Это будет работать. Проблема в том, что если изображение меньше, чем UIView, оно будет прокручиваться частично с экрана. Приложение для фотографий не позволяет этого и выглядит намного приятнее. – Jonah

+1

Да, я видел проблему, о которой Джона говорит в некоторых приложениях. Единственное приложение, которое я видел, было в состоянии сделать то, что мы хотим, правильно. Apple Photos.app :(До сих пор я просто фокусирую свое изображение внутри UIView, а затем размер изображения + любые вставки, которые мне нужны, чтобы он был центрирован внутри UIScroolView. Не оптимально, так как он добавляет черные полосы сверху и снизу. Выглядит немного лучше, если я удаляю полосы прокрутки (например, Photos.app). – runmad

4

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

Пример:

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

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

1) Добавить пустой взгляд на ваш scrollview, который является той же высотой вашего contentSize.

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

2) scrollRectToVisible на этом пустой зрения.

+0

скриншот сломан – Besi

0

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

myImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

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

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

0

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

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

1

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

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

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

6

Этот код должен работать на большинстве версий прошивки (и был протестирован для работы на 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; 
} 
+0

Я работаю над приложением iPad и хотел бы центрировать изображение показанный в DetailView.Я не подклассифицировал UIScrollView, вместо этого добавил этот код toAutorotateToInterfaceOrientation, и теперь он хорошо работает как в ландшафтном, так и в портретном режимах. – Sushant

Смежные вопросы