Как центрировать изображение в uiimageview / uiscrollview (до и после масштабирования) - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь центрировать изображение (по отношению к экрану iphone) так, чтобы при загрузке представления изображение имело ширину / высоту центра ... В моем случае мое представление загружается в точках пикселя 0,0само изображение, и если я уменьшу изображение, оно появится в верхнем левом углу, а не в середине центра экрана / вида.Вот что у меня есть:

UIImage *image = [UIImage imageNamed: @"t.bmp"];
self.view.backgroundColor = [UIColor blackColor];
self.mi.frame = CGRectMake(0, 0, image.size.width, image.size.height);
self.mi.contentMode = (UIViewContentModeCenter);
self.mi.backgroundColor = [UIColor blackColor];
[self.mi setImage:image];

/* Draw a line here!!
UIGraphicsBeginImageContext(self.mi.frame.size);
[self.mi.image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetLineWidth(context, 20.0);
CGContextBeginPath(context);
CGContextMoveToPoint(context, 0,0);
CGContextAddLineToPoint(context, 200, 200);    
CGContextMoveToPoint(context, 200,0);
CGContextAddLineToPoint(context, 0, 200);
CGContextStrokePath(context);
self.mi.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
*/

self.expimg.maximumZoomScale = 2.0;
self.expimg.minimumZoomScale = 0.1;
self.expimg.clipsToBounds = YES;
self.expimg.delegate = self;
[self.expimg setContentSize:self.mi.frame.size];

[self.expimg addSubview: self.mi];
[self.view addSubview: self.expimg];

Спасибо!

Редактировать: mi - это UIImageView, а expimg - это UIScrollView (используемый конструктор интерфейса).Кроме того, viewForZoomingInScrollView определен.

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Вы должны быть в состоянии сделать это, регулируя положение и размер изображения и прокручивая представление при начальной загрузке, а также при изменении уровней масштабирования.Создайте метод, который вызывается для viewDidLoad, и снова для UIScrollViewDelegate метода scrollViewDidZoom:.

Нечто подобное должно работать (где imageView и scrollView являются атрибутами класса):

- (void)centerImage {

    CGSize screenSize = CGSizeMake(320, 480);

    CGSize imageSize = imageView.frame.size;
    imageSize.width = imageSize.width * scrollView.zoomScale;
    imageSize.height = imageSize.height * scrollView.zoomScale;
    CGSize scrollSize = scrollView.frame.size;

    CGFloat centerX;
    CGFloat centerY;
    CGFloat left;
    CGFloat top;

    if (imageSize.width > screenSize.width) {
        scrollSize.width = imageSize.width;
        centerX = imageSize.width/2;
        left = 0;
    } else {
        scrollSize.width = screenSize.width;
        centerX = screenSize.width/2;
        left = centerX - imageSize.width/2;
    }

    if (imageSize.height > screenSize.height) {
        scrollSize.height = imageSize.height;
        centerY = imageSize.height/2;
        top = 0;
    } else {
        scrollSize.height = screenSize.height;
        centerY = screenSize.width/2;
        top = centerY - imageSize.height/2;
    }

    CGRect scrollFrame = scrollView.frame;
    scrollFrame.size = scrollSize;
    scrollView.frame = scrollFrame;

    CGRect imageFrame = imageView.frame;
    imageFrame.origin = CGPointMake(left, top);

    scrollView.contentOffset = CGPointMake(centerX-(imageSize.width/2), centerY-(imageSize.height/2));

}

Я не проверял это, поэтому некоторые мои математические вычисления могут быть ошибочными.В любом случае, надеюсь, это даст вам хорошее представление о том, что делать.

0 голосов
/ 13 ноября 2017

Шаг 1. Создайте свойство представления изображения, затем начните его с viewDidLoad и добавьте в scrollView:

self.pictureImage = [[UIImageView alloc]initWithImage:self.picture];
[_scrollView addSubview:_pictureImage];
self.pictureImage.alpha = 0;
_scrollView.delegate = self;

Шаг 2: Создайте AdjustZoomScale функцию, чтобы получить минимальный масштаб

- (CGFloat)adjustZoomScale{
CGFloat scale = self.scrollView.bounds.size.width / self.pictureImage.bounds.size.width;
CGFloat h = scale * self.pictureImage.bounds.size.height;
if (h > self.scrollView.bounds.size.height) {
    scale = self.scrollView.bounds.size.height / self.pictureImage.bounds.size.height;
}
return scale;
}

Шаг 3: потому что кадр вида прокрутки будет обновлен на viewDidAppear , поэтому нам нужно настроить масштаб увеличения здесь. И установите альфа, чтобы изображение выглядело более плавным:

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear: animated];
_scrollView.maximumZoomScale = 1.0;
_scrollView.minimumZoomScale = [self adjustZoomScale];
[_scrollView setZoomScale:_scrollView.minimumZoomScale];
self.pictureImage.alpha = 1;
}

Шаг 4. Реализация viewForZoomingInScrollView (метод делегирования с прокруткой) и возврат представления изображения

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

Шаг 5: Реализация scrollViewDidZoom (метод делегирования с прокруткой) и настройка точки для представления изображения

- (void)scrollViewDidZoom: (UIScrollView*) scrollView {
CGSize boundsSize = scrollView.bounds.size;
CGRect contentsFrame = _pictureImage.frame;

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

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

Спасибо Shawhu на этот пост за настройку точки для просмотра изображения при масштабировании

0 голосов
/ 15 мая 2012

[scrollView zoomToRect: CGRectMake (x, y, ширина, высота) анимированный: YES];будет работать для вас ... Где прямоугольник должен иметь эти координаты центра в качестве источника.

...