Iphone 在iOS 5中向下拖动UIView
我在我的iPhone应用程序中看到,状态栏上有一个可以访问通知中心的手势。我如何在我的应用程序中实现这种转换?。我认为这是通过滑动手势识别器完成的,但是如何将滑动手势从上到下包括在内(如何将通知中心拖过其完整转换)?是否有任何示例代码或其他东西可以帮助我做到这一点?Iphone 在iOS 5中向下拖动UIView,iphone,objective-c,cocoa-touch,ios5,uigesturerecognizer,Iphone,Objective C,Cocoa Touch,Ios5,Uigesturerecognizer,我在我的iPhone应用程序中看到,状态栏上有一个可以访问通知中心的手势。我如何在我的应用程序中实现这种转换?。我认为这是通过滑动手势识别器完成的,但是如何将滑动手势从上到下包括在内(如何将通知中心拖过其完整转换)?是否有任何示例代码或其他东西可以帮助我做到这一点? Thaks Prevance您可以实现UISweepGestureRecognitzer来处理应用程序中的滑动手势,并指定滑动方向以检测为UISweepGestureRecognitzerDirectionDown 这里有一个。还有
Thaks Prevance您可以实现UISweepGestureRecognitzer来处理应用程序中的滑动手势,并指定滑动方向以检测为UISweepGestureRecognitzerDirectionDown
这里有一个。还有一些值得一看。我建议“使用手势识别器简化触摸事件处理”和来自的“高级手势识别”应该很容易做到。假设您有一个
UIView
(mainView
),您希望从中触发下拉操作
下拉视图
)放在可见区域外的主视图顶部mainView
上执行touchsbegined
,并检查触摸是否在前30个像素(或点)内李>
触摸移动
,如果移动方向向下且下拉视图
不可见,如果是,则将下拉视图
向下拖动到主视图的可见区域,或者检查移动方向是否向上且下拉视图
可见,如果是,则将其向上推出可见区域touchesEnd
,通过检查下拉视图的移动方向来结束拖动或推动移动
//... inside mainView impl:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = (UITouch *)[touches anyObject];
start = [touch locationInView:self.superview].y;
if(start > 30 && pulldownView.center.y < 0)//touch was not in upper area of view AND pulldownView not visible
{
start = -1; //start is a CGFloat member of this view
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if(start < 0)
{
return;
}
UITouch *touch = (UITouch *)[touches anyObject];
CGFloat now = [touch locationInView:self.superview].y;
CGFloat diff = now - start;
directionUp = diff < 0;//directionUp is a BOOL member of this view
float nuCenterY = pulldownView.center.y + diff;
pulldownView.center = CGPointMake(pulldownView.center.x, nuCenterY);
start = now;
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if (directionUp)
{
//animate pulldownView out of visibel area
[UIView animateWithDuration:.3 animations:^{pulldownView.center = CGPointMake(pulldownView.center.x, -roundf(pulldownView.bounds.size.height/2.));}];
}
else if(start>=0)
{
//animate pulldownView with top to mainviews top
[UIView animateWithDuration:.3 animations:^{pulldownView.center = CGPointMake(pulldownView.center.x, roundf(pulldownView.bounds.size.height/2.));}];
}
}
/。。。内部mainView impl:
-(无效)触摸开始:(NSSet*)触摸事件:(UIEvent*)事件
{
UITouch*触摸=(UITouch*)[触摸任何对象];
开始=[touch locationInView:self.superview].y;
if(start>30&&pulldownView.center.y<0)//触摸不在视图的上部区域,且pulldownView不可见
{
start=-1;//start是此视图的CGFloat成员
}
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件
{
如果(开始<0)
{
返回;
}
UITouch*触摸=(UITouch*)[触摸任何对象];
CGFloat now=[touch locationInView:self.superview].y;
CGFloat diff=现在-开始;
directionUp=diff<0;//directionUp是此视图的BOOL成员
float numcentery=下拉视图.center.y+diff;
pulldownView.center=CGPointMake(pulldownView.center.x,numcentery);
开始=现在;
}
-(void)touchesend:(NSSet*)toucheevent:(UIEvent*)event
{
如果(方向向上)
{
//为visibel区域外的下拉视图设置动画
[UIView animateWithDuration:.3个动画:^{pulldownView.center=CGPointMake(pulldownView.center.x,-roundf(pulldownView.bounds.size.height/2.);}];
}
否则如果(开始>=0)
{
//使用从上到主视图的方式设置下拉视图的动画
[UIView animateWithDuration:.3个动画:^{pulldownView.center=CGPointMake(pulldownView.center.x,roundf(pulldownView.bounds.size.height/2.);}];
}
}
我通过在全尺寸的uicrollview
中使用子类的UIView
解决了这个问题。如果用户触摸到一个非“可拖动”的点,ui视图
将触摸事件传递到其参考底图视图
@实现MyCustomUIView
-(BOOL)pointInside:(CGPoint)pointwithevent:(UIEvent*)event
{
//检查我们是否在覆盖层上
如果
(
点y<460.0f
//也许这里有更多的限制
)
{
//阻止事件,传递给父级
返回否;
}
//一切都好吗
返回YES;
}
@结束
此代码使
UIScrollView
仅对460px以下的触摸做出响应。如果您的UIScrollView
例如800px高度,您可以从460px触摸到800px。足够打开、关闭和使用它。因此,如果您有一个全尺寸的UIScrollView
,您可以将其向上拖动以打开它,同时可以“触摸”参考底图视图。此方法的好处是,所有动画都依赖于默认行为,您不必自己实现。这是通知中心。因为这是一个系统范围内的手势,如果你在你的应用程序中实现了类似的东西,我怀疑a)苹果会拒绝它,因为它与通知中心冲突;或者b)你的用户不会看到它,因为通知中心会出现。@TomascmGuinness Te问题不是关于实现第二个通知中心,但是关于实现这样的用户交互。@TomasmGuinness,不,不,我只想展示一个这样的uiview控制器,,,这一切…@Kai yess,corret,如何从上到下获得滑动手势?可以使用左右滑动…@stackiphone我根本不使用滑动手势识别器,请参见下面的答案。是的,corret,谢谢你的回答。我知道如何实现滑动手势,但我如何才能像这样显示视图?,,谢谢你的回答,但我对iOS非常新,所以我认为这对我来说不容易。让我们试试吧…如果有任何示例ode或你知道的东西,那对我来说会更容易。。。thanks@Kai奥巴马的解决方案应该奏效。我鼓励您考虑一下,该功能将如何与应用程序中的Notification Center配合使用,以及它对您的用户来说是非直观的还是难以使用。例如,Android具有类似的通知中心功能;此外,您还可以在浏览器中稍微向下拉屏幕以进入地址栏。要在浏览器中访问地址栏而不意外地访问通知中心,可能会很困难。这可能在你的应用程序中运行良好,只是需要考虑一下。@stackiphone添加了一些可能需要调整的示例代码
@implementation MyCustomUIView
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// Check whether we are on the overlay
if
(
point.y < 460.0f
// Maybe some more restrictions here
)
{
// Block the event, pass to parent
return NO;
}
// Everything okay
return YES;
}
@end