1

我正在尝试实现某种可移动的视图,女巫会根据父视图框架的大小和位置来改变它自己的框架。我发现的唯一决定是在 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:

在此处输入图像描述

那么有没有其他方法可以达到同样的效果呢?

4

0 回答 0