Почему это преобразование с использованием CATransform3D уменьшает ширину представления?

Взгляните на следующую последовательность изображений:

enter image description here enter image description here enter image description here

Сначала то, что здесь происходит, я выбрал «Бейсбол», в результате чего 3 серых вида, которые вы видите, повернуты влево, так что один с разными уровнями находится посередине (второе изображение). Вы можете видеть, что уже на этом этапе ширина обзора существенно уменьшилась. Третье изображение появляется после щелчка по представлению, содержащему названия видов спорта, в результате чего оно возвращается к середине.

Насколько я могу судить, ширина обзора уменьшается при повороте в середину. Но я не знаю почему.

Вот соответствующий код. pos указывает, где будет располагаться рассматриваемое представление . 0 указывает на то, что он находится посередине, 1 указывает, что он находится на единицу справа от середины, -1 на единицу слева от середины, и т. д.

- (void)perspectiveView:(MenuSection *)view forPosition:(NSInteger)pos
{

    CALayer *layer = view.layer;
    CATransform3D transform = CATransform3DIdentity;

    MenuSection *prevView = (pos >= 0) ? (MenuSection *)[self viewWithTag:view.tag - 1] : (MenuSection *)[self viewWithTag:view.tag + 1];

    if (pos == 0) {
        view.changingToFrame = CGRectMake(round((480 - view.frame.size.width)/2), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        view.frame = view.changingToFrame;

    } else {

        if (pos == 1) {
            NSLog(@"%@",NSStringFromCGRect(prevView.changingToFrame));
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / 1000;
        } else if (pos == -1){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / -1000;
        } else if (pos == 2){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / 500;
        } else if (pos == -2){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / -500;
        }

        view.frame = view.changingToFrame;

        transform = CATransform3DRotate(transform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
    }

    layer.transform = transform;
}
5
задан maxedison 17 January 2012 в 02:27
поделиться