2014-12-23 2 views
0

У меня есть фотография, показывающая приложение iOS, в котором пользователь должен иметь возможность просматривать и масштабировать изображение. В соответствии с требованием изображение должно отображаться в полном размере (прозрачная часть не должна отображаться, а изображение должно заполнять весь экран), и поэтому я использовал режим AspectFill для UIImageView. Чтобы реализовать функцию масштабирования, используется UIScrollView и реализован метод делегирования viewForZoomingInScrollViewUIScrollView. Представление изображения связано с четырьмя краями прокрутки в StoryBoard, а два ограничения (imageHeight и imageWidth) подключены к IBOutlet. Эти ограничения будут обновлены в методе ViewControllers viewDidLayoutSubviews.UIView внутри проблемы с масштабированием Scrollview

Я добавил код ниже для справки.

- (void)setImageViewModes { 
    self.scrollView.minimumZoomScale = CALCULATD_ZOOM_SCALE; 
    self.pageImageView.contentMode = UIViewContentModeScaleAspectFill; 
} 

pragma mark - UIScrollView Delegate 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 

    return MY_IMAGE_VIEW; 
} 

- (void)updateImageViewConstraints { 

    self.imageHeight.constant = CGRectGetHeight(self.scrollView.frame); 
    self.imageWidth.constant = CGRectGetWidth(self.scrollView.frame); 
    [self.view layoutIfNeeded]; 
} 

Однако при попытке уменьшить изображение, оно восстанавливается в исходное состояние и внешняя часть изображения обрезается (Это отображать только начальный заполненную часть изображения). Существует ли какое-либо обходное решение для просмотра всего изображения при уменьшении масштаба?

Я попытался установить минимальную шкалу масштабирования для UIScrollView (у меня есть метод в моем коде для вычисления минимальной масштабной шкалы изображения), и функция масштабирования работает. Однако, когда мы уменьшаем масштаб изображения, UIIMage всегда перемещается в верхний левый угол прокрутки (привязанный к снимку экрана для справки). enter image description here

Я нашел решение этой проблемы на Center content of UIScrollView when smaller (третий ответ), подклассифицируя UIScrollView и настраивая рамку просмотра изображения в методе прокрутки «layoutSubviews». Это отлично работает при уменьшении. Но когда мы масштабируем и прокручиваем изображение, чтобы увидеть край/боковую часть, scrollview перенастраивает изображение в центр, и я не могу видеть боковую часть изображения в режиме масштабирования. Любой обходной путь для этой проблемы?

+0

Пробовали ли вы CGAffineTransformMake недвижимость? – Vignesh

ответ

1

Использовать этот

-(void)scrollViewDidZoom:(UIScrollView *)scrollView1{ 
[self centerScrollViewContent]; 

}

- (void)centerScrollViewContent { 
CGSize boundsSize = self.scrollView.bounds.size; 
CGRect contentsFrame = self.drawingView.frame; 

if (contentsFrame.size.width < boundsSize.width) { 
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2.0f; 
} else { 
    contentsFrame.origin.x = 0.0f; 
} 

if (contentsFrame.size.height < boundsSize.height) { 
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
} else { 
    contentsFrame.origin.y = 0.0f; 
} 
self.drawingView.frame = contentsFrame; 

} версия

0

Swift 3 из Rahul's code

func scrollViewDidZoom(_ scrollView: UIScrollView) { 
    centerContentView() 
} 

func centerContentView() { 
    let boundsSize = scrollView.bounds.size 
    var contentFrame = contentView.frame 

    if contentFrame.size.width < boundsSize.width { 
     contentFrame.origin.x = (boundsSize.width - contentFrame.size.width)/2.0 
    } else { 
     contentFrame.origin.x = 0.0 
    } 
    if contentFrame.size.height < boundsSize.height { 
     contentFrame.origin.y = (boundsSize.height - contentFrame.size.height)/2.0 
    } else { 
     contentFrame.origin.y = 0.0 
    } 

    contentView.frame = contentFrame 
} 
Смежные вопросы