2010-11-18 51 views
1

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

一般的问题是我应该甚至试图让CALayers进入像按钮等UI对象?因为他们在其他方面非常灵活,我喜欢与他们合作。

谢谢!

回答

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]; 

我不知道这将在多大程度上把我在一个非常复杂的术语UI。从这里,我可能会根据返回的名称将返回的图层委托给返回的图层。但是,这可能会很快变得丑陋,所以尽管我在这里回答了我自己的问题,但我真的很想从一个真正知道他们在做什么的人那里得到一些输入! :D谢谢!