1

我现在正在尝试创建一个带有“3D 立方体”和可点击边的应用程序。

为了创建一个“3D 立方体”,我发现了一篇很棒的文章:这里 它使用了一些“层”。

我想做的是做一个 3D 立方体,但有可点击的边。我发现了一些这样的例子:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([touches count] == 1) {
        for (UITouch *touch in touches) {
            CGPoint point = [touch locationInView:[touch view]];
            point = [[touch view] convertPoint:point toView:nil];

            CALayer *layer = [(CALayer *)self.view.layer.presentationLayer hitTest:point];

            layer = layer.modelLayer;
            layer.opacity = 0.5;
        }
    }
}

但是这种代码在不同方面没有区别。所以我尝试对文章中的代码进行一些更改。例如,要创建第一面,代码是:

CALayer *sideOne = [CALayer layer];
sideOne.borderColor = [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor;
sideOne.backgroundColor = [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:0.4].CGColor;
sideOne.borderWidth = Border_Width;
sideOne.cornerRadius = Corner_Radius;
sideOne.frame = layerRect;
sideOne.position = self.center;

和 :

transformLayer = [CATransformLayer layer];
[transformLayer addSublayer:test.layer];
transformLayer.anchorPointZ = Layer_Size/-2;
[rootLayer addSublayer:transformLayer];

所以我尝试进行一些修改,最后在这一侧添加一个“UIButton”。像这样 :

UIButton * test = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[test setFrame:CGRectMake(0.0, 0.0, layerSize, layerSize)];
[test addTarget:self action:@selector(ActionTest) forControlEvents:UIControlEventTouchUpInside];
test.layer.borderColor = [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor;
test.layer.backgroundColor = [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:0.4].CGColor;
test.layer.borderWidth = Border_Width;
test.layer.cornerRadius = Corner_Radius;
test.layer.frame = layerRect;
test.layer.position = self.center;

但问题是,当我想将它添加到一边时。

当我做 :

transformLayer = [CATransformLayer layer];
[self addSubview:test];
[transformLayer addSublayer:test.layer];
transformLayer.anchorPointZ = Layer_Size/-2;
[rootLayer addSublayer:transformLayer];

按钮没有反应

当我这样做时:

transformLayer = [CATransformLayer layer];
[transformLayer addSublayer:test.layer];
transformLayer.anchorPointZ = Layer_Size/-2;
[self addSubview:test];
[rootLayer addSublayer:transformLayer];

按钮做出反应,但不随立方体的其余部分移动

我明白这个问题,但不知道如何解决它......

谢谢 !

4

1 回答 1

1

您所看到的是从 UIResponder 继承的 UIButton 和不直接构成响应程序链的一部分的 CALayer 之间的区别。

幸运的是,有一种简单的方法可以从响应者链中获取事件并将它们定向到您选择的 CALayer,它看起来有点像这样:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    CGPoint p = [(UITouch*)[touches anyObject] locationInView:self.worldView];
    for (CALayer *layer in self.worldView.layer.sublayers) {
        if ([layer containsPoint:[self.worldView.layer convertPoint:p toLayer:layer]]) {
            // do something
        }
    }
}

containsPoint:convertPoint:toLayer:就是你所寻求的东西的本质。

在这篇文章中也有关于这个主题的更多相关讨论

为了将此点与您的调用联系起来,当您将按钮的层添加到其他层时,所有视觉方面都按预期执行,但没有人是响应者链的成员,因此没有人会收到要处理的触摸。

于 2013-11-02T14:03:02.513 回答