我在我的iPhone应用程序中看到,状态栏上有一个可以访问通知中心的手势。我如何在我的应用程序中实现这种转换?我认为这是通过滑动手势识别器完成的,但是如何从上到下包含滑动手势(如何将通知中心拖动到完整过渡状态)?有没有任何示例代码或可以帮助我做到这一点的东西? Thaks提前在iOS 5中拖动UIView
回答
应该很容易做到。假设您有一个UIView
(mainView
),您想从中触发下拉事件。
- 将子视图(
pulldownView
)放在mainView顶部可见区域之外。 - 在
mainView
上执行touchesBegan
并检查触摸是否在前30个像素(或点)中。 - 执行
touchesMoved
如果您检查移动方向是否关闭,并且pulldownView
不可见,如果是,请将pulldownView
向下拖动到主视图的可见区域,或者检查移动方向是否向上,如果是,则向上推出可见区域。 - 执行
touchesEnd
您可以通过检查pulldownView
移动的方向来结束拖动或推动运动。
编辑:
下面是一些示例代码。未经测试,可能包含错别字,也许不会编译,但应包含所需的基本部分。
//... 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.));}];
}
}
,,谢谢你的回答,但是我对iOS很新,所以我认为它对我来说不是那么容易..如果有任何样本代码或你知道的东西,那将会更容易我...谢谢 – stackiphone 2012-04-25 15:13:01
@ Kai的解决方案应该可以工作。我建议您稍微考虑一下该功能如何与您的应用中的Notification Center配合使用,以及它是否对用户不直观或难以使用。例如,Android具有类似的通知中心功能;此外,您还可以在浏览器中轻轻拉下屏幕以访问地址栏。可能很难在浏览器中访问地址栏,而不会意外获取通知中心。这在您的应用中可能正常工作,只是需要思考。 – strings42 2012-04-25 15:17:15
@stackiphone添加了一些示例代码,可能需要一些调整 – 2012-04-25 15:54:31
您可以实现UISwipeGestureRecognizer来处理您的应用中的滑动手势,并指定滑动的方向以检测为UISwipeGestureRecognizerDirectionDown。
有一个Apple sample here。还有一些WWDC10 sessions值得一看。我建议使用that page的“简化手势识别器的触摸事件处理”和“高级手势识别”。
是的相关,谢谢你的答案..我知道如何实施滑动手势,但我怎么能显示这样的看法? – stackiphone 2012-04-25 15:01:37
我刚好在一个全尺寸的UIScrollView
使用子类UIView
解决了这个问题。如果用户触摸不是“可拖动”的点,则UIView
将触摸事件传递到其下面的视图。
@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
此代码使得UIScrollView
仅响应460px以下的触摸。如果您的UIScrollView
例如800px高度,则可以将它从460px触摸到800px。足以打开,关闭并使用它。因此,如果您获得了全尺寸的UIScrollView
,则可以将其向上拖动以打开它,同时可以“触摸”下视图。这种方法的好处是,所有的动画都会继承默认行为,而且您不必亲自实施它。
- 1. 拖动UIView
- 2. 如何在uiscrollview中向uiview添加拖动手势ios
- 3. Swift iOS - 检测触摸拖动从外部输入UIView UIView
- 4. 在手指下拖动UIView
- 5. 在UIViews之间拖动UIView
- 6. UIView拖动事件
- 7. swift xcode 8.0 - uiimageview在uiview中拖动
- 8. UIView在UIView中,拖动以显示内容
- 9. “启动”拖放一个UIView
- 10. UIView拖动(图像和文字)
- 11. 如何使UIbutton在UIView内拖动?
- 12. UIView iOS上可拖动行为的名称是什么?
- 13. 停止UIView被拖动屏幕
- 14. HTML 5拖动事件
- 15. 通过拖动IOS
- 16. 的UIView在IOS
- 17. 在iOS 5中继承UIScrollView时不能拖动对象,有帮助吗?
- 18. IOS的UIView动画(的onUpdate)
- 19. iOS UIView动画CATransform3DMakeRotation混淆
- 20. 拖动touchesBegan后创建的UIView
- 21. 拖动时调整UIView框架
- 22. 如何使拖动的UIView减速?
- 23. 拖动周围的UITextField UIView的(SWIFT)
- 24. 拖动uiview推视图控制器
- 25. UIView动画不工作在ios 5.1
- 26. 动画中的uiview透视图iOS
- 27. iOS 5 UIView drawRect覆盖不能在设备上工作
- 28. UIView和UIControl在UIScrollView中拖动时不同UIScrollView
- 29. 如何在UIScrollView中实现一个可拖动的UIView子类?
- 30. 当addsubview:被调用时,UIView拖放 - 拖动视图消失?
这是通知中心。由于这是一个系统范围的手势,如果您在应用程序中实施了类似的操作,我怀疑a)Apple会拒绝它,因为它与通知中心冲突,或者b)您的用户看不到它,因为通知中心将出现。 – tomasmcguinness 2012-04-25 14:39:07
@tomasmcguinness问题不是关于实现第二个通知中心,而是关于如何实现用户交互。 – 2012-04-25 14:44:03
@tomasmcguinness,不,不,我只是想展示一个像这样的uiview控制器,那alll ... – stackiphone 2012-04-25 14:58:04