CAScrollLayer不会滚动!

时间:2010-02-25 03:34:25

标签: iphone objective-c cocoa-touch iphone-sdk-3.0

也许是因为它已经晚了。无论是什么原因,我无法弄清楚为什么我遇到一个简单的CSScrollLayer示例我正在尝试。我将一个50像素的Eclipse图标添加到基于视图的项目和我的initialize方法中(从initWithNibName:bundle :)调用我有这个:

-(void) initialize
{
  CAScrollLayer *scrollLayer = [CAScrollLayer layer];
  scrollLayer.backgroundColor =  [[UIColor blackColor] CGColor];
  CGRect bounds = self.view.bounds;
  scrollLayer.bounds = CGRectMake(0, 0, bounds.size.width, bounds.size.height);
  scrollLayer.contentsRect = CGRectMake(0, 0, bounds.size.width + 800, bounds.size.height + 800);
  scrollLayer.borderWidth = 2.5;
  scrollLayer.borderColor = [[UIColor redColor] CGColor];

  scrollLayer.position = CGPointMake(self.view.center.x, self.view.center.y - 20);
  scrollLayer.scrollMode = kCAScrollBoth;
  [self.view.layer addSublayer:scrollLayer];
  UIImage *image = [UIImage imageNamed:@"eclipse32.gif"];
  for(int i=0; i<6; i++) {
    layer = [CALayer layer];
    layer.backgroundColor = [[UIColor blackColor] CGColor];
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.contents = (id)[image CGImage];
    layer.position = CGPointMake(layer.bounds.size.width * i, self.view.center.y);
    [scrollLayer addSublayer:layer];
  }
//  [button removeFromSuperview];
//  [self.view addSubview:button];
//  self.view.userInteractionEnabled = YES;
  [image release];
}

滚动图层显示,图标在图层上重复我有一个围绕屏幕边缘的边框。一切都很可爱,除了我不能滚动图标。我试过/没有设置滚动模式。我尝试过一个从屏幕上掉下来的拉伸图标。我已经尝试了一切。我做错了什么?

2 个答案:

答案 0 :(得分:4)

CAScrollLayer未插入UIEvent链,因此您需要手动添加代码以修改触摸事件的滚动偏移。像UIScrollView那样获得滚动动量也很棘手。我强烈建议使用UIScrollView重新实现 - 它会非常简单。唯一的另一种选择是手动触摸事件处理,这很痛苦!我尝试使用CAScrollLayer获得一个不错的滚动条,并在手动实现一些笨拙的滚动行为后放弃了。

我使用CALayer或UIView的一般规则是在不需要任何用户交互时使用CALayer对象。如果用户要触摸它,使用UIView,它是一个非常轻量级的对象,因此开销可以忽略不计。

那就是说,我发现CAScrollLayer非常无用!为什么不使用CALayer并修改边界?可能有一些用处,但它不能代替UIScrollView。

答案 1 :(得分:0)

尝试将此添加到您的示例中以编程方式滚动图层:

- (void)scroll {
[scrollLayer scrollToPoint:scrollPoint];
scrollPoint.x += 10;
[self performSelector:_cmd withObject:nil afterDelay:0.1];
}

并在initialize方法的末尾添加:

scrollPoint = CGPointMake(0, 0);
[self scroll];