Какао NSView анимация - PullRequest
       7

Какао NSView анимация

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

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

Я хочу, чтобы переход выглядел так, как будто второй вид был позади первого и теперь выдвигается снизу. По этой причине я создал «imaaryRect», который точно представляет, где будет находиться второе представление (называемое progressBarView) , если бы оно отображалось полностью, и использую это для проверки пересечения при перемещении imaaryRect вниз. Но затем я делаю прямоугольник ниже пересечения (который был бы ImagaryRect за вычетом высоты пересечения), который фактически отображает второе представление и который называется newFrame.

Это все работает отлично, за исключением того, как анимируется второй вид. Я хочу, чтобы он выскользнул из-под верхнего, что означало бы, что, когда вид начинает появляться под верхним, пользователь сначала увидит, как появляется нижняя часть второго вида, когда он сдвинулся вниз, он ' Я вижу среднюю часть, и, наконец, верхняя часть заканчивается, и все они видны. На самом деле происходит то, что когда вид начинает появляться, он появляется сверху вниз. Сначала появляется верхняя часть, затем средняя, ​​а затем нижняя. Это не создает впечатление, что он выскользнул из-под верхнего. На самом деле, похоже, что он не движется, и вместо этого создается впечатление, что что-то, что было поверх него, покрывало его, скользило вниз.

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

Это код, который я использую:

CGRect imaginaryRect = NSMakeRect(progressBarView.frame.origin.x,progressBarView.frame.origin.y, view.frame.size.width, view.frame.size.height);

CGRect rectIntersection = CGRectIntersection (view.frame,
                                              imaginaryRect);

//if view and imaginary progress bar view frame intersect, the view is lowered
//the second condition prevents one drop too many at the end
if (!CGRectIsNull(rectIntersection) && (rectIntersection.size.height!=0)) {
    CGRect offsetFrame = CGRectOffset (imaginaryRect, 0, -1);
    imaginaryRect = offsetFrame;

    //rectIntersection is recalculated after the offset, so it's height is subtracted for newFrame
    rectIntersection = CGRectIntersection(view.frame, imaginaryRect);

    //the rect below the area of intersection
    CGRect newFrame = CGRectMake(imaginaryRect.origin.x, imaginaryRect.origin.y, view.frame.size.width, view.frame.size.height-rectIntersection.size.height); 

    //move the PBview to the new, slightly lowered frame (this is the frame that's located below the front view, but subtracts the intersection)
    [progressBarView setFrame:newFrame];

Спасибо за помощь!

...