iOS UIView 3D边框

iOS UIView 3D border

我一直在研究像 UIView 这样的硬币,它有 3d 旋转。

我能够基于手势使用 CATransform3dRotate 实现旋转效果。现在我需要在图像旋转时实现类似阴影的效果。

请参考随附的图片。

有什么建议吗?建议?或者示例代码会很棒

Sample Requirement

您可能想看看 SceneKit. I've put together a quick demo, which you can download here,一个 3D 硬币对象,它通过滑动手势水平向左或向右旋转,具有逼真的光源和阴影。相关代码如下:

import UIKit
import SceneKit

class ViewController: UIViewController {

    @IBOutlet weak var sceneView: SCNView!

    let rotate90AboutZ = SCNAction.rotateByX(0.0, y: 0.0, z: CGFloat(M_PI_2), duration: 0.0)

    var currentAngle: Float = 0.0
    var coinNode = SCNNode()

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.userInteractionEnabled = true
        sceneView.backgroundColor = UIColor.blackColor()
        sceneView.autoenablesDefaultLighting = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(true)
        coinSceneSetup()
    }

    func coinSceneSetup() {

        let coinScene = SCNScene()
        //coin is rendered as a cylinder with a very small height
        let coinGeometry = SCNCylinder(radius: 50, height: 2)
        coinNode = SCNNode(geometry: coinGeometry)
        coinNode.position = SCNVector3Make(0.0, 25.0, 25.0)
        coinScene.rootNode.addChildNode(coinNode)
        //rotate coin 90 degrees about the z axis so that it stands upright
        coinNode.runAction(rotate90AboutZ)

        let shinyCoinMaterial = SCNMaterial()
        shinyCoinMaterial.diffuse.contents = UIColor.lightGrayColor()
        shinyCoinMaterial.specular.contents = UIColor.whiteColor()
        shinyCoinMaterial.shininess = 1.0
        coinGeometry.firstMaterial = shinyCoinMaterial
        sceneView.scene = coinScene
        let panRecognizer = UIPanGestureRecognizer(target: self, action: "panGesture:")
        sceneView.addGestureRecognizer(panRecognizer)
    }

    //allows for coin to spin with a right or left finger swipe, while still keeping it rotated 90 degrees about z axis
    func panGesture(sender: UIPanGestureRecognizer) {
        let translation = sender.translationInView(sender.view!)
        var newAngle = (Float)(translation.x)*(Float)(M_PI)/180.0
        newAngle += currentAngle
        coinNode.runAction(SCNAction.rotateToX(CGFloat(newAngle), y: 0.0, z: CGFloat(M_PI_2), duration: 0.0))
        if(sender.state == UIGestureRecognizerState.Ended) {
            currentAngle = newAngle
        }
    }      
}

有几个优秀的入门教程,例如 here, here, and here. weheartswift.com put out a three part tutorial in Swift that I personally find especially useful. Here are parts 1, 2 and 3

Jeff Lamarche 的 introduction to SceneKit on OS X, along with his accompanying source code 也是宝贵的资源。