【问题标题】:Clickable CALayer UIs可点击的 CALayer UI
【发布时间】:2010-11-18 06:01:48
【问题描述】:
我有一个类似coverflow 的图像轮播,可以通过iPhoto 脚本桥抓取照片。我将视图设置为接受第一响应者并实现了左右箭头的方法,但从概念上讲,我无法弄清楚如何使图层可点击。我知道接受鼠标按下事件是包含视图的工作,但我无法将这些碎片放在一起。
一般来说,我是否应该尝试将 CALayers 制作成 UI 对象,如按钮等?因为他们在其他方面非常灵活,我喜欢和他们一起工作。
谢谢!
【问题讨论】:
标签:
cocoa
core-animation
calayer
【解决方案1】:
好的,这就是我拼凑的。上下文是我有一个带有一个子层(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,我返回包含鼠标按下发生点的图层,然后设置图层的某些属性以显示它被击中。
- (void)mouseDown:(NSEvent *)theEvent {
CALayer *layer = [self.layer hitTest:NSPointToCGPoint([theEvent locationInWindow])];
layer.backgroundColor = [CGColorHolder red];
}
此外,您必须确保包含的窗口接受 mouseMoved 事件:
[window acceptsMouseMovedEvents];
我不知道在真正复杂的 UI 方面这会让我走多远。从这里开始,我可能会根据返回的名称将要执行的操作委托给返回的层。但这可能会很快变得丑陋,所以即使我在这里回答了我自己的问题,我真的很想从真正知道自己在做什么的人那里得到一些意见! :D 谢谢!