gpt4 book ai didi

ios - UIPanGestureRecognizer 最大化和最小化 UIView

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:46:17 24 4
gpt4 key购买 nike

为了最小化和最大化 UIView,我使用了 UIPangestureRecognizer。代码如下:

-(void) pannningMyView:(UIPanGestureRecognizer*) panGesture{
CGPoint newPoint=[panGesture translationInView:self.view];
CGPoint oldPoint=self.myPanningView.frame.origin;
CGFloat dx=newPoint.x;
CGFloat dy=newPoint.y;
if(dx>0){
CGRect oldRect=self.myPanningView.frame;
oldRect.size.width+=dx;
oldRect.size.height+=dy;
self.myPanningView.frame=oldRect;
}
}

但是,过渡非常快,以至于我只移动了几个像素,它就覆盖了整个屏幕。我无法弄清楚我的代码需要进行哪些更正。

最佳答案

问题是您的翻译是累积的,因为 translationInView 是从连续手势的开头开始的,但是您是将翻译添加到当前帧,而不是原始帧。这可以通过检查手势状态来解决,如果您处于手势的开始,则保存原始帧,然后在手势进行时将其用作 future 翻译的基础。

-(void) panningMyView:(UIPanGestureRecognizer*) panGesture
{
static CGRect originalFrame; // or you could make this a non-static class ivar

if (panGesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = self.myPanningView.frame;
}
else if (panGesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [panGesture translationInView:self.view];
if (translation.x > 0) {
CGRect newFrame = originalFrame;
newFrame.size.width += translation.x;
newFrame.size.height += translation.y;
self.myPanningView.frame = newFrame;
}
}
}

请注意,我去掉了 oldPoint,因为您似乎没有使用它。我还将 newPoint 重命名为 translation 因为它不是屏幕上的一个点,而是衡量你的手指在屏幕上移动(或平移)了多少。我还将 oldRect 重命名为 newFrame,因为我认为这样更准确地捕捉到了它是什么。

基本上,我试图保留您的例程的逻辑,但只是阐明您的逻辑和变量名称。我本以为你可能需要一个额外的 else if 原因,检查结束或取消的手势,使用动画来适本地完成或反转手势,但我没有像你那样解决这个问题'在您的原始问题中引用它。

无论如何,我希望您了解我们在这里所做的事情。我们正在保存原始帧并将翻译应用于该帧,而不是将其应用于当前帧。


更新:

在后续问题中,您询问了如何阐明动画。你可能会这样做:

-(void) panningMyView:(UIPanGestureRecognizer*) panGesture
{
static CGRect originalFrame; // or you could make this a non-static class ivar
CGPoint translation = [panGesture translationInView:self.view];

if (panGesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = self.myPanningView.frame;
}
else if (panGesture.state == UIGestureRecognizerStateChanged)
{
if (translation.x > 0) {
CGRect newFrame = originalFrame;
newFrame.size.width += translation.x;
newFrame.size.height += translation.y;
self.myPanningView.frame = newFrame;
}
}
else if (panGesture.state == UIGestureRecognizerStateEnded ||
panGesture.state == UIGestureRecognizerStateCancelled ||
panGesture.state == UIGestureRecognizerStateFailed)
{
CGRect finalFrame = originalFrame;

// if we've gone more than half way, move it all the way,
// otherwise return it to the original frame

if (translation.x > (self.view.frame.size.width / 2.0))
{
finalFrame.size.width += self.view.frame.size.width;
finalFrame.size.height += self.view.frame.size.height;
}

[UIView animateWithDuration:0.5
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.myPanningView.frame = finalFrame;
}
completion:nil];
}
}

关于ios - UIPanGestureRecognizer 最大化和最小化 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14032330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com