2013-08-09 6 views
4

У меня проблема с UIImageView внутри UIScrollView. В интерфейсе Builder UIScrollView занимает весь экран, а UIImageView занимает весь UIScrollView. Проблема в том, что когда у меня есть изображение, ориентированное на ландшафт, у меня он установлен на аспект, поэтому у меня есть серые полосы сверху и снизу (что я и хочу). Однако, когда я увеличиваю масштаб фотографии, как только фотография масштабируется достаточно большой, чтобы соответствовать вертикали экрана, я хочу, чтобы она не качалась в серой зоне, которая была над ней. Смотрите скриншоты, которые я приложил. Я в основном хочу, чтобы он работал как приложение «Фотографии» в этом отношении. Вот мой код для настройки UIScrollView и UIImageView:UIImageView внутри UIScrollView Pans Too Far

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    self.imageView.image = [UIImage imageNamed:@"IMG_0300.JPG"]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.scrollView.clipsToBounds = YES; 
    self.scrollView.contentSize = self.imageView.bounds.size; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = 5.0; 
    self.scrollView.minimumZoomScale = 1.0; 

} 

-(void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.imageView; 
} 

See how it pans too far up

Спасибо заранее.

Jacob

ответ

10

Это ваш весь UIImageView масштаб изображения, а не только его образ, но и серые полосы. Ваш scrollView просто честно отражает это. Результат вы хотите, вероятно, можно сделать так:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIImage *image = [UIImage imageNamed:@"IMG_0300.JPG"]; 
    CGFloat ratio = CGRectGetWidth(self.scrollView.bounds)/image.size.width; 
    self.imageView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.scrollView.bounds), image.size.height * ratio); 
    self.imageView.center = CGPointMake(CGRectGetMidX(self.scrollView.bounds), CGRectGetMidY(self.scrollView.bounds)); 
    self.imageView.image = image; 
    self.scrollView.clipsToBounds = YES; 
    self.scrollView.contentSize = self.imageView.bounds.size; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = 10.0; 
    self.scrollView.minimumZoomScale = 1.0; 

} 

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    UIView *subView = self.imageView; 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? 
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; 

    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? 
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; 

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
           scrollView.contentSize.height * 0.5 + offsetY); 
} 

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.imageView; 
} 
+0

Спасибо, этот ответ настолько хорошо, что я принимаю его в два раза, если бы я мог :) –

+0

Великого. Благодарю . Помогло мне много – sajwan

+0

Я реализовал ваш код и в viewDidAppear: анимированные границы UIImageView вернулись к размеру, объявленному в раскадровке. У вас есть ключ к тому, что может вызвать это? –

0

Вместо «серые полосы сверху и снизу», установить цвет фона UIScrollView к серому.

Кроме того, не следует использовать размеры вида в viewDidLoad, поскольку подпункты еще не выложены. Переместите его на didLayoutSubviews или viewWillAppear. Также установите UIScrollViewcontentSize на основе максимального увеличения. Например:

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    self.scrollView.backgroundColor = [UIColor lightGrayColor]; // or other color 
    CGFloat maxScale = 5.0; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = maxScale; 
    self.scrollView.minimumZoomScale = 1.0; 
    CGSize contentSize = CGSizeMake(self.scrollView.bounds.size.width * maxScale, self.scrollView.bounds.size.height * maxScale); 
    self.scrollView.contentSize = contentSize; 

    // ... 
} 
0

Попробуйте это:

UIView *subView = self.imageView; 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? 
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; 

    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? 
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; 

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
           scrollView.contentSize.height * 0.5 + offsetY); 
Смежные вопросы