可点击的CALayer用户界面

时间:2010-11-18 06:01:48

标签: cocoa core-animation calayer

我有一个类似于Coverflow的图像轮播抓取带iPhoto脚本桥的照片。我将视图设置为接受第一响应者并实现了左箭头和右箭头的方法,但从概念上讲,无法弄清楚如何使图层可点击。我知道接受鼠标按下事件是包含视图的工作,但我无法将这些部分放在我的脑海中。

总的来说,我是否应该尝试将CALayers转换为按钮等UI对象?因为他们在其他方面非常灵活,我喜欢和他们一起工作。

谢谢!

1 个答案:

答案 0 :(得分:3)

好的,这就是我拼凑在一起的东西。上下文是我有一个自定义视图,其中有一个子层(CATextLayer),我正在使用内置布局管理器进行约束。这是CustomView.m中的awakeFromNib

- (void) awakeFromNib {

CALayer *layer = [CALayer layer];
layer.backgroundColor = [CGColorHolder black];
layer.layoutManager = [CAConstraintLayoutManager layoutManager];
[self setLayer:layer];
[self setWantsLayer:YES];

CATextLayer *textLayer = [CATextLayer layer];
textLayer.string = @"TextLater";
textLayer.name = @"textLayer";
textLayer.fontSize = 42.0f;
textLayer.alignmentMode = kCAAlignmentCenter;
[textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX relativeTo:@"superlayer" attribute:kCAConstraintMidX offset:0.0f]];
[textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY offset:-50.0f]];

}

然后我覆盖了自定义视图的mouseDown方法。使用-hitTest,我返回包含mousedown发生点的图层,然后设置图层的某些属性以显示它已被击中。

- (void)mouseDown:(NSEvent *)theEvent {   

CALayer *layer = [self.layer hitTest:NSPointToCGPoint([theEvent locationInWindow])];
layer.backgroundColor = [CGColorHolder red];

}

此外,您必须确保包含窗口接受mouseMoved事件:

[window acceptsMouseMovedEvents];

我不知道这对于一个非常复杂的用户界面会带来多大的影响。从这里开始,我可能会根据返回的名称委托对返回的图层做什么。但这可能会变得非常快,所以尽管我在这里回答了我自己的问题,但我真的很想得到一些真正知道自己在做什么的人的意见! :D谢谢!