触摸并下拉视图

时间:2011-12-31 22:50:54

标签: iphone ios ipad uinavigationcontroller uitabbarcontroller

我在界面顶部(状态栏下方)有一个uiview,只显示它的底部。

实际上,我想让红色uiview向下滑动,以便通过拖动完全显示,例如本机iOS中的notificationcenter,而不仅仅是通过点击按钮。

我应该用什么来“触摸和拉下”uiview,以便完全显示?

Example

3 个答案:

答案 0 :(得分:9)

无需找到drag-n-drop的解决方法。 UIScrollView可以在没有任何性能损失的情况下进行操作。

pulldown

@interface PulldownView : UIScrollView

@end

@implementation PulldownView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (!self) {
        return self;
    }
    self.pagingEnabled = YES;
    self.bounces = NO;
    self.showsVerticalScrollIndicator = NO;
    [self setBackgroundColor:[UIColor clearColor]];
    double pixelsOutside = 20;// How many pixels left outside.
    self.contentSize = CGSizeMake(320, frame.size.height * 2 - pixelsOutside);
    // redArea is the draggable area in red.
    UIView *redArea = [[UIView alloc] initWithFrame:frame];
    redArea.backgroundColor = [UIColor redColor];
    [self addSubview:redArea];
    return self;
}

// What this method does is to make sure that the user can only drag the view from inside the area in red.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (point.y > height)
    {
        // Leaving useless touches to the views under it.
        return nil;
    }
    return [super hitTest:point withEvent:event];
}

@end

使用方法:
1.初始化PulldownView的实例 2.使用[addSubview:]将要显示的任何内容添加到实例 3.将区域隐藏为红色。

[pulldownView setContentOffset:CGPointMake(0, heightOfTheView - pixelsOutside)];

这是一个简单的例子。您可以添加任何功能,例如在可拖动区域的底部添加标题按钮栏以实现单击删除,或者向界面添加一些方法以由调用者重新定位它。

答案 1 :(得分:3)

创建UIView

的子类

覆盖touchesBegan:withEventtouchesMoved:withEvent

touchesBegan中可能会进行视觉上的更改,以便用户知道他们正在触摸视图。 在touchesMoved中使用     [[touches anyObject] locationInView:self] 和     [[touches anyObject] previousLocationInView:self]

计算当前触摸位置与最后触摸位置之间的差异(检测向下拖动或向后拖动)。

然后,如果您要自定义绘图,请致电[self setNeedsDisplay]告诉您的观点重绘其drawRect:(CGRect)rect方法。

注意:这假定此视图不使用多次触摸。

答案 2 :(得分:1)

请参阅iPhone App: implementation of Drag and drop images in UIView

中的答案

您只需使用TouchesBeginTouchesEnded方法即可。在该示例中,我展示了如何使用CGPoint,而不是必须尝试使用​​setFramedrawRect作为您的观点。

一旦调用了TouchesMoved方法,您就必须使用setFramedrawRect(不确定,但有效但主要是setFrame)也取CGPoint的高度