Вставить 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
Когда я запускаю приложение, изображение не прокручивается. Выполняя все то же самое, когда автоматическая компоновка отключена (со стойками и пружинами), у меня есть рабочая прокрутка.
Я думаю, проблема связана с ограничениями. Может ли кто-нибудь помочь мне, пожалуйста?
Ответы
Ответ 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!
Счастливое кодирование...