Ход перехода вручную для жестов UIViews и Pan

Я пытаюсь реализовать какой-то вид подвижного вида, который изменит свой кадр в соответствии с размером и положением кадра родительского вида. Единственное решение, которое я нашел, это добавить наблюдателя в рамку superview.

- (void)willMoveToSuperview:(UIView *)newSuperview
{
    [self.superview removeObserver:self forKeyPath:@"frame"];
    [newSuperview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
}

Затем я изменяю фрейм представления через делегата, если фрейм супервизии изменяется

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    if([keyPath isEqualToString:@"frame"])
    {
        if([self.superview respondsToSelector:@selector(progressForMovedView:)])
        {
            CGFloat progress = [(id <MovableViewProgressProtocol>)self.superview progressForMovedView:self];

            self.frame = [self proposedFrameForFrame:_startFrame targetFrame:_endFrame andProgress:progress];
        }
    }
}

- (CGRect)proposedFrameForFrame:(CGRect)baseFrame targetFrame:(CGRect)targetFrame andProgress:(CGFloat)progress
{
    CGRect frame = baseFrame;

    frame.origin.x      += (targetFrame.origin.x - frame.origin.x) * progress;
    frame.origin.y      += (targetFrame.origin.y - frame.origin.y) * progress;
    frame.size.width    += (targetFrame.size.width - frame.size.width) * progress;
    frame.size.height   += (targetFrame.size.height - frame.size.height) * progress;

    return frame;
}

Наконец это выглядит как на GIF:

так есть ли другие способы получить такой же эффект?

0 ответов

Другие вопросы по тегам