Масштабирование 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 в комментариях:

<a href="http://github.com/evgenyneu/ios-imagescroll" rel="nofollow noreferrer" target="_blank">http://github.com/evgenyneu/ios-imagescroll</a> проверьте это. Отлично работает для меня.

Решение, предлагаемое в этом репозитории, заключается в настройке минимального и текущего уровня масштабирования перед отображением изображения:

@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.