Масштабирование фотографии в UIScrollView - PullRequest
0 голосов
/ 02 марта 2012

У меня есть UIScrollView, и его единственным недостатком является отображение одного токена фотографии с камеры или выбранного из библиотеки фотографий.

Но есть одна проблема - ориентация фотографий,

Я имею в виду, "вертикальные" фотографии (фотографии, высота которых> ширина), в сравнении с "горизонтальными" фотографиями (ширина> высота).

И то, что я хочу, похоже на отображение одной фотографии в системе.Приложение для фотографий

, в котором я могу удобно масштабировать как вертикальное, так и горизонтальное фото

Во-первых, вот мой код моего пользовательского PhotoView (который в основном управляет UIScrolView и UIImageView)

// .h
@interface PhotoView : UIView
<UIScrollViewDelegate>{
    UIScrollView *myScrollView;
    UIImageView *photoView;
}
...
@end
// .m
- (void)refreshPhoto:(UIImage *)aPhoto {
    if (aPhoto) {
        CGSize photoSize = aPhoto.size;
        CGSize scrollSize = self.myScrollView.frame.size;
        if (photoSize.height > photoSize.width) { // vertical photo
            self.photoView.frame = CGRectMake(0, 0, scrollSize.width, scrollSize.height);
        }
        else { // horizontal photo, initially it should be zoomed out to fit the width of myScrollView
            CGFloat factor = photoSize.width / scrollSize.width;
            self.photoView.frame = CGRectMake(0, 0, scrollSize.width, photoSize.height / factor);
            self.photoView.center = CGPointMake(scrollSize.width / 2, scrollSize.height / 2);
        }
    }
    else  // no photo
        self.photoView.frame = self.myScrollView.frame;
    self.photoView.image = aPhoto;
    //self.myScrollView.zoomScale = 1.0;
    //self.myScrollView.contentSize = self.photoView.frame.size;
}
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"photoViewBg.png"]];
        self.myScrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(30, 35, 260, 360)] autorelease];
        self.myScrollView.delegate = self;
        self.myScrollView.maximumZoomScale = 2.5;
        self.myScrollView.minimumZoomScale = 1.0;
        self.myScrollView.backgroundColor = [UIColor clearColor];
        self.photoView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] autorelease];
        self.myScrollView.contentSize = self.imageView.frame.size;
        [self.myScrollView addSubview:self.photoView];
        [self addSubview:self.imageView];
    }
    return self;
}
#pragma mark - Scroll View Delegate
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.photoView;
}

И моя проблема в том, что мой код изначально работал нормально с вертикальными фотографиями - независимо от того, насколько велика или мала фотография, была увеличена, то есть

, когда я масштабирую и затем перетаскиваю фотографию накадра myScrollView ((30, 35, 260, 360) на экране устройства),

, он всегда возвращается к краю myScrollView.

Но когда я начиналС горизонтальными фотографиями все запутано.

Из моего кода вы можете видеть, что изначально я хочу для горизонтальной фотографии следующее: ширина горизонтальных> равна их высоте, а ширина myScrollView <высота,</p>

поэтому изначально горизонтальные должны быть посередине myScrollView, с той же шириной, но меньшей высотой, оставляя два одинаковых пробела на верхней и нижней сторонах,

, затем при увеличениии прокручивая, его "край отскока" также должен быть таким же, как у myScrollView, точно так же, как у вертикальных.

Боюсь, мой плохой английский не может выразить себя очень четко, если вы меня не понимаетепросто сделайте вертикальное и горизонтальное фото на устройстве IOS, затем попробуйте увеличить и перетащить их в приложение «Фото», посмотреть, как они отображаются изначально и как они возвращаются.

Так что теперь я незнаю, как получить тот эффект, который я хочу, на самом деле мне не так ясно с UIScrollView - хотя я уже несколько раз читал документ.

Я пытался изменить contentSize в myScrollView, чтобы настроить как вертикальные, так и горизонтальные фотографии, но пока не сделал этого,

, и теперь я всегда устанавливаю contentSize таким же, как размер myScrollView, потому чтоЯ думаю, что края myScrollView всегда являются правильными «краями отскока» для любой увеличенной фотографии.

Но теперь этот photoView имеет как проблемы для вертикальных, так и горизонтальных фотографий, например, фотография полностью прокручивается из myScrollView и становится невидимой, нонисколько не отскочить назад,

или верхний «край отскока» находится под реальным верхним краем myScrollView на некотором расстоянии, и фотографии всегда отскакивают назад, что всегда оставляет пробел выше.Я не уверен, правильно ли я понимаю, как работает UIScrollView.

Если contentSize всегда равен фотографии, которую я отображаю или фиксирую в myScrollView,

и когда фотография масштабируетсяили нет, размер контента также изменился или никогда?

Я должен быть остороженвы позаботитесь о contenOffset и contentInset, но как?

Хотелось бы, чтобы кто-нибудь мог предложить мне помощь!

Спасибо большое!

1 Ответ

7 голосов
/ 03 марта 2012

Я решил это, просто позаботьтесь о contentSize и его позиции (contentInset и contentOffset)

Мне удалось решить эту проблему с помощью кода ниже:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    CGSize nowSize = view.frame.size;
    if (nowSize.height >= self.myScrollView.frame.size.height)
        self.myScrollView.contentInset = UIEdgeInsetsZero;
    else {
        CGFloat delta = self.myScrollView.frame.size.height/2 - view.frame.size.height/2;
        self.myScrollView.contentInset = UIEdgeInsetsMake(delta, 0, delta, 0);
    }
}
...