contentOffset в UIScrollView после поворота iPhone - PullRequest
5 голосов
/ 20 ноября 2010

У меня UIImageView в UIScrollView, и у меня возникли проблемы со свойством contentOffset. Со ссылкой Apple, это определяется как:

contentOffset : точка, в которой источник представления содержимого смещен относительно начала представления прокрутки.

Например, если изображение находится в верхнем левом углу экрана, как показано ниже, то contentOffset будет (0,0):

   _________
   |IMG    |
   |IMG    |
   |       |
   |       |
   |       |
   |       |
   ---------

Для поворота устройства у меня есть следующие настройки:

 scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
       UIViewAutoresizingFlexibleHeight);

 imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
       UIViewAutoresizingFlexibleHeight);

 imageView.contentMode = UIViewContentModeCenter;  
    scrollView.contentMode = UIViewContentModeCenter;

Это заставит все вращаться вокруг центра экрана. После поворота экрана экран будет выглядеть следующим образом:

    ______________
    |       IMG  |
    |       IMG  |
    |            |
    --------------

Моя проблема в том, что если я сейчас прочитаю contentOffset, это все равно (0,0). (Если переместить UIImage в ландшафтном режиме, значение contentOffset будет обновлено, но оно будет вычислено с учетом неправильного источника.)

Есть ли способ вычислить координаты для UIImage относительно левого верхнего угла экрана. contentOffset, кажется, только возвращает это значение, когда экран находится в начальной ориентации вида.

Я пытался прочитать self.view.transform и scrollView.transform, но они всегда идентичны.

1 Ответ

3 голосов
/ 29 ноября 2010

Вот один из способов сделать это: Для набора прокрутки

scrollView.autoresizingMask =(UIViewAutoresizingFlexibleWidth 
                                     | UIViewAutoresizingFlexibleHeight);

scrollView.contentMode = UIViewContentModeTopRight;

В режиме UIViewContentModeTopRight верхний левый угол будет удерживаться с координатой (0,0), даже если поведение поворота будет неправильным,Чтобы получить то же поведение поворота, что и в UIViewContentModeCenter, добавьте

    scrollView.contentOffset = fix(sv.contentOffset, currentOrientation, goalOrientation);

в willAnimateRotationToInterfaceOrientation.fix - это функция

CGPoint fix(CGPoint offset, UIInterfaceOrientation currentOrientation, UIInterfaceOrientation goalOrientation) {

CGFloat xx = offset.x;
CGFloat yy = offset.y;

CGPoint result;

if (UIInterfaceOrientationIsLandscape(currentOrientation)) {

    if (UIInterfaceOrientationIsLandscape(goalOrientation)) {
        // landscape -> landscape
        result = CGPointMake(xx, yy);
    } else {
        // landscape -> portrait
        result = CGPointMake(xx+80, yy-80);
    }
} else {
    if (UIInterfaceOrientationIsLandscape(goalOrientation)) {
        // portrait -> landscape
        result = CGPointMake(xx-80, yy+80);
    } else {
        // portrait -> portrait
        result = CGPointMake(xx, yy);
    }
}
return result;
}

Приведенный выше код заставит представление прокрутки вращаться вокруг центра экрана, а также гарантирует, что верхний левый угол всегда является координатами (0,0).

...