Подтвердить что ты не робот

Вставить ImageView в ScrollView с автоматической компоновкой на iOS 6

Я пытаюсь сделать очень простой элемент с новым iOS 6 SDK с автоматической компоновкой. У меня есть ImageView и встроенный его в ScrollView. (все построено с помощью Interface Builder). Файл .png установлен, а режим ImageView установлен на "Вверху слева".

Реализация:

#import "ImaginariumViewController.h"

@interface ImaginariumViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation ImaginariumViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.scrollView.contentSize = self.imageView.image.size;
    self.imageView.frame =
    CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
}

@end

Когда я запускаю приложение, изображение не прокручивается. Выполняя все то же самое, когда автоматическая компоновка отключена (со стойками и пружинами), у меня есть рабочая прокрутка. Я думаю, проблема связана с ограничениями. Может ли кто-нибудь помочь мне, пожалуйста?

4b9b3361

Ответ 1

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

Около 5 минут назад, однако, я попробовал что-то, что исправило еще одну проблему, с которой я столкнулся, и, да! UIScrollView снова работает! Решением было переместить старый код, который устанавливает свойство UIScrollView contentSize в реализацию viewDidAppear, а не viewDidLoad:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.theScroller.contentSize=CGSizeMake(200.0,2000.0);
}

Я надеюсь, что это поможет кому-то еще столкнуться с некоторыми из головных болей, появившихся с помощью Auto Layout.

Ответ 2

Автозапуск может быть очень запутанным вначале. На самом деле вы не хотите устанавливать contentSize прокрутки в любом месте. При использовании чистого подхода к автоопределению scrollview устанавливает свой собственный размер контента. См. Раздел об автозапуске и UIScrollView в примечаниях к выпуску iOS 6:

Ограничения на представлениях вида прокрутки должны приводить к размер, который затем интерпретируется как размер содержимого просмотр прокрутки. (Это не следует путать с intrinsicContentSize, используемый для автоматической компоновки.)

Обратите внимание, что это означает, что ограничения на subviews scrollview должны устанавливать явные ширины и высоты и не использовать ширину, которая зависит от аспектов прокрутки.

Вторая ошибка заключается в том, что вы устанавливаете кадр UIImageView в размер изображения. С автозапуском это тоже не нужно. UIImageView имеет intrinsicContentSize, который является размером основного изображения. (Чтобы изменить это, вы должны установить ограничения для ширины и высоты с высоким приоритетом). Это означает, что с автоматической компоновкой для размещения изображения в прокрутке и его прокрутки правильный код должен быть следующим:

** nothing at all!!! **

Но вам все же нужно следить за тем, что может привести к тому, что у вас появится изображение, которое не прокручивается, и подсказка в примечаниях к выпуску:

Обратите внимание, что вы можете сделать представление подпрограммы вида прокрутки для float (не прокручивать) по другому прокручиваемому контенту, создавая ограничения между представлением и представлением вне поддерева прокрутки, например, просмотр прокрутки.

то есть. если вы установите ограничения в построителе интерфейса и ограничите представление изображения представлением над прокруткой в ​​иерархии, это повлияет на просмотр прокрутки. Mad!

Счастливое кодирование...