UIImageViews встраиваются в UIScrollView в код с включенной автоматической компоновкой

В настоящее время у меня проблемы с моим приложением iOS и Autolayout. Я хочу, чтобы пользователь прокручивал фотографии из Tumblr в UIScrollView (аналогично приложению «Фото» при прокрутке вашей библиотеки). Поэтому, когда мой ImageViewController появляется на экране, у него есть массив сообщений, но еще нет данных для изображений. Моя проблема заключается в следующем:

В моем scrollView я хочу добавить столько UIImageViewS, сколько необходимо, и я хотел бы, чтобы все они были одинакового размера. Как я должен это делать? Я пробовал много (вероятно, плохо разработанных :-/) способов, таких как initwithframe: с включенной автоматической компоновкой и сохранением ссылки на них в NSMutableArray...

Теперь моя цель - добавить их в мой scrollView в viewDidLoad и установить правильные ограничения.

Спасибо за вашу помощь и извините за мой плохой английский

ИЗМЕНИТЬ

ОК, я решил свою проблему: я использовал хороший scrollView и установил его ограничения с автоматической компоновкой в ​​viewWillAppear

Вот код для интересующихся (извините за макет): - (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];
[self downloadPhotos];
[self.scrollView setContentOffset:CGPointMake(self.selectedImageIndex * self.scrollView.frame.size.width, 0) animated:NO];

// Add UIImageViewS to self.scrollView with constraints and so on...
NSMutableDictionary *viewsDictionnary = [[NSMutableDictionary alloc] init];
NSMutableString *imageViewsString = [[NSMutableString alloc] init];
NSMutableArray *imageViews = [[NSMutableArray alloc] init];

for (int i = 0; i < self.fetchedResultsController.fetchedObjects.count; i++) {
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.scrollView.bounds];
    imageView.image = [UIImage imageNamed:@"placeholder_imageView"];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.scrollView addSubview:imageView];

    [imageViews addObject:imageView];
    [viewsDictionnary setObject:imageView forKey:[NSString stringWithFormat:@"imageView%d", i]];
    [imageViewsString appendString:[NSString stringWithFormat:@"[imageView%d]", i]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0]];
}
self.imageViews = imageViews;
NSString *horizontal = [NSString stringWithFormat:@"H:|%@|", imageViewsString];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:horizontal options:0 metrics:0 views:viewsDictionnary]];
[self.scrollView setContentOffset:CGPointMake(self.selectedImageIndex * self.scrollView.frame.size.width, 0) animated:NO];

}


person f.c.    schedule 05.05.2013    source источник


Ответы (2)


Я рекомендую не использовать scrollView, а вместо этого использовать collectionView (iOS 6 и выше). Вы, вероятно, будете настаивать на том, что вам нужно использовать iOS 5 или iOS 4. Упростите себе задачу, collectionViews упростят управление памятью, и если вы планируете загружать много фотографий в поле зрения, просто используйте представления collection. Затем вы можете создать collectionViewCell, который будет иметь UIImageView. UIImageView будет иметь только один размер, затем вы можете установить его свойство масштабирования изображения, чтобы оно соответствовало масштабу, чтобы независимо от формы или размера изображения соответствовали представлению изображения и не искажались. Проведите некоторое исследование представлений коллекции, черт возьми, возможно, есть учебник, который вы можете использовать для загрузки изображений из Интернета и отображения их с помощью представления коллекции.

person Kris Gellci    schedule 05.05.2013
comment
Это было бы хорошей идеей, но я также хотел бы увеличить изображения, чтобы под ними была панель инструментов и пользовательский вид, отображающий заголовок из tumblr. Спасибо за ваш ответ в любом случае - person f.c.; 05.05.2013
comment
Все это можно сделать с помощью collectionView. CollectionView — это scrollView, к которому добавлено гораздо больше функций. Я действительно предлагаю, по крайней мере, проверить учебник. - person Kris Gellci; 06.05.2013
comment
Да, спасибо за ваш ответ. Я уже использую два collectionViews в своем приложении. Дело в том, что я хочу использовать здесь возможности полной прокрутки, а не collectionView. Поэтому я прошу остаться с scrollView и использовать некоторые ограничения. Но спасибо за вашу помощь. Я продолжаю экспериментировать с UIScrollView. - person f.c.; 06.05.2013

 -(void)viewDidLoad 
 {
      [super viewDidLoad];

      float posX = 0.0 , poxY = 0.0;

      float sizeWidth = 100 , sizeHeight = 200;

      float scrollContentWidth = 320.0;

      scrollview.showsHorizontalScrollIndicator=YES;
      scrollview.scrollEnabled=YES;
      scrollview.userInteractionEnabled=YES;
      self.scrollView.pagingEnabled = TRUE;

      for(int i=0;i<[imageArray count];i++)
      {
           NSString *imageURL = [imageArray objectAtIndex:i];

           UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(posX,posY,sizeWidth,sizeHeight)];

           [imageView setImage:[UIImage imageWithContentsOfFile:imageURL]];

           [self.scrollView addSubview:imageView];

           [imageView addConstraint:
           [NSLayoutConstraint constraintWithItem:imageView 
           attribute:NSLayoutAttributeWidth
           relatedBy:NSLayoutRelationEqual
           toItem:imageView 
           attribute:NSLayoutAttributeWidth
           multiplier:1
           constant:100]];

           [imageView  addConstraint:
           [NSLayoutConstraint constraintWithItem:imageView 
           attribute:NSLayoutAttributeHeight
           relatedBy:NSLayoutRelationEqual
           toItem:imageView 
           attribute:NSLayoutAttributeHeight
           multiplier:1
           constant:200]];

           [self.scrollView setContentSize:CGSizeMake(480.0,scrollContentWidth)];

           scrollContentWidth=scrollContentWidth+320.0;

           posX = posX + 320.0;
      }
 }

Надеюсь, это поможет вам.

person Gaurav Rastogi    schedule 05.05.2013
comment
Спасибо за быстрый ответ. Как я уже сказал, я хотел, чтобы он работал с автоматической компоновкой, потому что размер scrollView будет часто меняться. Поэтому я предполагаю, что несколько запрещено использовать setFrame для UIImageView... (или также initWithFrame). Во-вторых, я должен был сказать, что изображения будут загружаться в другом потоке. Поэтому я просто хочу иметь указатель (хранящийся в моем свойстве imageViews) на них, чтобы я мог установить их изображение позже. Спасибо за ваш ответ в любом случае! - person f.c.; 05.05.2013