我正在开发一个项目,需要创建一个类似于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,所以当我试图拖动图标时它会延迟一点。在那个小的延迟之后,它发送信号回到滚动视图以滚动页面。请如果我错了,请纠正我。)
因此,如果对代码执行上述任务的任何帮助将非常感激。我已经在这个地方呆了将近一个星期而没有希望。非常感谢。
答案 0 :(得分:1)
非常好的Uiscrollview示例,如iphone Home Screen
答案 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 } } }