Интерактивные пользовательские интерфейсы CALayer - PullRequest
1 голос
/ 18 ноября 2010

У меня есть карусель изображений, похожая на обложку, с фотографиями со скриптовым мостом iPhoto. У меня есть вид, настроенный на прием первого респондента, и я реализовал методы для стрелок влево и вправо, но концептуально не могу понять, как подойти, чтобы сделать слои интерактивными. Я знаю, что принимать события, связанные с мышью вниз, - это работа, содержащая представление, но я не могу соединить части в своей голове.

Суть в том, должен ли я даже пытаться превратить CALayers в объекты пользовательского интерфейса, такие как кнопки и т. Д.? Потому что они очень гибки в других отношениях, и я люблю работать с ними.

Спасибо!

1 Ответ

3 голосов
/ 20 ноября 2010

Хорошо, это то, что я собрал.В контексте у меня есть пользовательское представление с одним подуровнем (CATextLayer), которое я ограничиваю встроенным менеджером макета.Вот awakeFromNib в CustomView.m

- (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 Спасибо!

...