Ход перехода вручную для жестов 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:
так есть ли другие способы получить такой же эффект?