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

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

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

4b9b3361

Ответ 2

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

Ответ 3

Я также согласен с предложением 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;
}