【问题标题】:Create 3D cube with layers, with clickable sides - objective C创建具有层的 3D 立方体,具有可点击的侧面 - 目标 C
【发布时间】:2013-11-02 13:37:38
【问题描述】:

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

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

我想做的是做一个 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];

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

我了解问题,但不知道如何解决...

谢谢!

【问题讨论】:

    标签: ios objective-c 3d uibutton calayer


    【解决方案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: 将包含您所寻求的本质。

    a bit more largely relevant discussion around this topic on this post too

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

    【讨论】:

    • 但是使用这段代码,你如何区分不同的层?我的意思是,在我发现的项目中,它们是创建 3D 立方体的 6 个不同层,但是如何知道它是我点击的第一个还是第二个?
    • 对 [self.someView.layer convertPoint:somePoint toLayer:targetLayer] 的调用负责将视图上的触摸转换为图层上的坐标。询问 [layer containsPoint:convertedPoint];会给你一个关于该点是哪一层的是或否的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多