Масштабирование UIImageView внутри UIScrollView с автозапуском

У меня есть 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 в коде, который может работать.

У кого-нибудь еще есть проблемы?

3 ответа

Решила мою проблему, используя следующий пример кода. Репозиторий github соответствует книге "Программирование iOS" Мэттом Нойбургом.

https://github.com/********/Programming-iOS-Book-Examples/blob/11c6c57743b04e6e722b635b87be69fa41a5abaf/ch20p573scrollViewAutoLayout/ch20p573scrollViewAutoLayout/ViewController.m


Лучшее решение было предложено 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;
}
</uiscrollviewdelegate>

Однако примеры конатинов выдаются с масштабированием. Изображение не центрируется. Это можно легко устранить, используя специальный класс просмотра прокрутки со следующим кодом в нем:

@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;
}

licensed under cc by-sa 3.0 with attribution.