Как визуализировать UIView на 2 части - PullRequest
4 голосов
/ 09 декабря 2011

Я пытаюсь развить эффект перехода, когда один вид разделяется на 2 части с верхней частью, анимированной вверх, и нижней частью, анимированной вниз, чтобы насладиться видом позади него.Я использую подходы UIView и UIImageView для достижения следующих целей:

// 1. Make a screenshot:
    UIGraphicsBeginImageContext(parentView.frame.size);
    [parentView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // 2. Calculate rectangles for top and bottom part:
    CGRect rectTop, rectBottom;
    CGFloat W = rectBig.size.width;
    CGFloat H = rectBig.size.height;


    rectTop = CGRectMake(0, 0, W, y_cutoff);
    rectBottom = CGRectMake(0, y_cutoff, W, H - y_cutoff);

    // 3. Create top and bottom images:
    CGImageRef imageRefTop      = CGImageCreateWithImageInRect([screenshot CGImage], rectTop);
    CGImageRef imageRefBottom   = CGImageCreateWithImageInRect([screenshot CGImage], rectBottom);


    UIImage *imageTop = [UIImage imageWithCGImage:imageRefTop];
    UIImage *imageBottom = [UIImage imageWithCGImage:imageRefBottom];


// 4. Assign images to image views:
imageViewTop.image = imageTop;
imageViewBottom.image = imageBottom;

// 5. Animate image views:
[UIView beginAnimation:nil context:NULL];
.... animation code here
[UIView commitAnimations];

Этот код, однако, очень медленный на устройстве, и я уверен, что есть более эффективный способ осуществить такой переход.Скорее всего, используя CALayers и т. Д. Можете ли вы указать мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Это не анимация. Ваш код рисования медленный. Если вы профилируете, вы увидите, что renderInContext: (кстати, всегда выполняется в главном потоке) и CGImageCreateWithImageInRect являются ограничивающими факторами. О чем ваш взгляд (тот, который вы хотите разделить)? Можно ли создать два представления вместо одного с самого начала?

2 голосов
/ 09 декабря 2011

Сама анимация не должна быть медленной. Все, что вам действительно нужно сделать, это изменить положение Y двух видов для анимации.

Почему бы вам не попробовать поместить статические изображения в UIImageViews и посмотреть, как тогда работает анимация?

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

...