Ответ 1
Решила мою проблему, используя следующий пример кода. Репозиторий github соответствует книге "Программирование iOS" Мэттом Нойбургом.
У меня есть UIImageView, встроенный внутри UIScrollView, до iOS 6 и автоопределения. Я использовал следующий фрагмент внутри метода контроллера viedDidLoad для отображения прокручиваемого и масштабируемого изображения.
self.scrollView.contentSize = self.imageView.image.size;
self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
Но теперь вместо этого используются ограничения, установленные в раскадровке. Я нашел этот вопрос Вставить ImageView в ScrollView с автоматической компоновкой на iOS 6 и некоторые другие здесь, в SO, заявив, что ограничения загружаются/принудительно после viewDidLoad, и что перемещение моего предыдущий фрагмент для viewDidAppear исправит эту проблему, но масштабирование не работает должным образом, и кажется, что размеры scrollView и imageView составляют reset для ограничения раскадровки после жестов сжиматься до зума.
Я просто догадываюсь, но я думаю, может быть, если есть способ переопределить вертикальные и горизонтальные ограничения scrollView и imageView в коде, который может работать.
У кого-нибудь еще есть проблемы?
Решила мою проблему, используя следующий пример кода. Репозиторий github соответствует книге "Программирование iOS" Мэттом Нойбургом.
Лучшее решение было предложено Zsolt в комментариях:
http://github.com/evgenyneu/ios-imagescroll проверьте это. Отлично работает для меня.
Решение, предлагаемое в этом репозитории, заключается в настройке минимального и текущего уровня масштабирования перед отображением изображения:
@interface MyViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.scrollView.delegate = self;
[self initZoom];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[self initZoom];
}
// Zoom to show as much image as possible
- (void) initZoom {
float minZoom = MIN(self.view.bounds.size.width / self.imageView.image.size.width,
self.view.bounds.size.height / self.imageView.image.size.height);
if (minZoom > 1) return;
self.scrollView.minimumZoomScale = minZoom;
self.scrollView.zoomScale = minZoom;
}
- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
Однако примеры конатинов выдаются с масштабированием. Изображение не центрируется. Это можно легко устранить, используя специальный класс просмотра прокрутки со следующим кодом в нем:
@interface MyScrollView : UIScrollView
@end
@implementation MyScrollView
-(void)layoutSubviews
{
[super layoutSubviews];
UIView* v = [self.delegate viewForZoomingInScrollView:self];
CGFloat svw = self.bounds.size.width;
CGFloat svh = self.bounds.size.height;
CGFloat vw = v.frame.size.width;
CGFloat vh = v.frame.size.height;
CGRect f = v.frame;
if (vw < svw)
f.origin.x = (svw - vw) / 2.0;
else
f.origin.x = 0;
if (vh < svh)
f.origin.y = (svh - vh) / 2.0;
else
f.origin.y = 0;
v.frame = f;
}
@end
Я также согласен с предложением Zsolt и ссылкой.
Но я обновляю ограничения ширины/высоты, чтобы разрешить обрабатывать изображение любого размера:
- (void) initZoom
{
for (NSLayoutConstraint *constraint in self.photoImageView.constraints)
{
if (constraint.firstAttribute == NSLayoutAttributeWidth)
constraint.constant = self.photoImageView.image.size.width;
else if (constraint.firstAttribute == NSLayoutAttributeHeight)
constraint.constant = self.photoImageView.image.size.height;
}
float minZoom = MIN(self.scrollView.bounds.size.width / self.photoImageView.image.size.width,
self.scrollView.bounds.size.height / self.photoImageView.image.size.height);
if (minZoom > 1) return;
self.scrollView.minimumZoomScale = minZoom;
self.scrollView.zoomScale = minZoom;
}