【问题标题】:CAScrollLayer doesn't scroll!CAScrollLayer 不滚动!
【发布时间】:2011-01-20 20:19:12
【问题描述】:

也许是因为太晚了。无论是什么原因,我都无法弄清楚为什么我在尝试一个简单的 CSScrollLayer 示例时遇到问题。我将一个 50 像素的 Eclipse 图标添加到基于视图的项目中,并在我的初始化方法中(从 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];
}

滚动层显示,图标在层上重复我在屏幕边缘周围有一个边框。一切都很可爱,只是我无法滚动图标。我试过有/没有设置滚动模式。我试过使用一个从屏幕上掉下来的拉伸图标。我什么都试过了。我做错了什么?

【问题讨论】:

  • 该主题在documentation 的第一段/唯一一段中介绍。

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


【解决方案1】:

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

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

并在初始化方法的末尾添加:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我得出了几乎相同的结论。想确定我没有疯。所以简而言之,CAScrollLayer 没有实现用户启动的滚动?我发现很难找到描述正确或推荐使用此组件的在线示例。
    • 层不属于响应者链。通过后台视图捕获您希望操作(触摸)的事件,并让视图调用图层,告诉它要滚动到哪个点或矩形。 Apple 也提供了一个使用 CAScrollLayer 的示例 - CALayerEssentials。
    • CALayerEssentials 示例代码不是很有帮助,但是 - 它仅使用移动到图像罗盘位置的按钮实现“滚动”。这对寻找真实界面滚动示例的人没有帮助,无论是通过触摸事件还是鼠标事件(在 Mac 上)。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2015-04-03
    相关资源
    最近更新 更多