使用Scrollview和Buttons创建一个类似iPhone主屏幕的屏幕

时间:2010-03-18 10:12:53

标签: iphone cocoa-touch uiscrollview

我正在开发一个项目,需要创建一个类似于iPhone主屏幕的屏幕:

  • 包含多个页面的滚动视图
  • 一堆图标
  • 当不处于编辑模式时,滑动不同的页面(即使我开始触摸图标)
  • 如果不处于编辑模式,请点按图标以执行某些操作
  • 处于编辑模式时,将图标拖动到交换位置,甚至可以交换到不同的页面
  • 处于编辑模式时,点按图标将其删除

之前我从几个论坛上读到,我必须将UIScrollview子类化,以便在其上面为UIViews提供触摸输入。所以我将其子类化为覆盖处理触摸的方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //If not dragging, send event to next responder
    if (!self.dragging)
        [self.nextResponder touchesBegan:touches withEvent:event];
    else
        [super touchesBegan:touches withEvent:event];
}

一般情况下,我类似地覆盖了touchesBegan:,touchesMoved:和touchesEnded:方法。

然后在视图控制器中,我添加了以下代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    UIView *hitView = (UIView *)touch.view;
    if ([hitView isKindOfClass:[UIView class]]) {
        [hitView doSomething];
        NSLog(@"touchesBegan");
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // Some codes to move the icons
    NSLog(@"touchesMoved");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesEnded");
}

当我运行应用程序时,我正确检测到touchesBegan方法。但是,当我试图拖动图标时,图标只是移动了一点,然后页面开始滚动。在控制台中,它仅使用2或3个“touchesMoved”消息进行记录。但是,我从另一个项目中了解到,只要我还在屏幕上拖动,就应该记录吨“touchesMoved”消息。

(我怀疑我将delayedContentTouches设置为YES,所以当我试图拖动图标时它会延迟一点。在那个小的延迟之后,它发送信号回到滚动视图以滚动页面。请如果我错了,请纠正我。)

因此,如果对代码执行上述任务的任何帮助将非常感激。我已经在这个地方呆了将近一个星期而没有希望。非常感谢。

3 个答案:

答案 0 :(得分:1)

非常好的Uiscrollview示例,如iphone Home Screen

https://github.com/jarada/myLauncher

答案 1 :(得分:0)

在这里,我一直在开发一个类似天气应用程序的应用程序......这是你应该做的...转到苹果开发者网站并搜索一个名为PageControl的示例应用程序。然后,一旦你使用你的应用程序的scrollllview你应该有一个自定义方法来计算UIViews的高度和宽度(即图标)和你[UIColor colorWithPatternImage:(UIImage *)图像)]所以你可以给它一个图像。然后你将视图s放在一个可变数组中,动画我会玩CA动画和UIView动画,甚至可以自定义。

答案 2 :(得分:0)

如果您的目标是iOS 3.2+,我建议您使用UIGestureRecognizer。对于您的用例UIPanGestureRecognizer是正确的选择。

手势处理代码应如下所示:

- (void)handlePanGesture:(UIGestureRecognizer *)gestureRecognizer;
{   
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
       panOffset = [gestureRecognizer locationOfTouch:0 inView:topView];
    }

    if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        CGPoint delta = self.scrollView.contentOffset;
            delta += ([gestureRecognizer locationOfTouch:0 inView:scrollView].x - panOffset.x);
        self.scrollView.contentOffset = delta;
    }
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
                if(self.scrollView.contentOffset >= (self.scrollView.bounds.size.width / 2)) {
                   // animate to the next multiple of self.scrollView.bounds.size.width
                } else {
                   // animate to previous multiple
                }

    }
}