Как установить UIScrollView как 3D Square
Я работаю над Photo Editing App, и у меня есть 3 Scrollviews с UIImageview, я хочу установить ScrollViews как ниже
Я пробовал " Scenekit ", но это не сработает, потому что я хочу ScrollableView.
В основном я хочу создать 3D-коллаж
Есть ли другой способ сделать это?
Можно ли установить UIScrollView как 3d Square?
Ответы
Ответ 1
Я достигаю этого, используя CATransform3D, используя следующий код
Я создал 3 Scrollview с UIImageview в StoryBoard
@IBOutlet var faces: [UIView]!
ViewDidiLoad
var perspective: CATransform3D = CATransform3DIdentity
perspective.m34 = -1.0 / 500.0
self.view?.layer.sublayerTransform = perspective
perspective = CATransform3DRotate(perspective, CGFloat(-Double.pi / 4), 1, 0, 0)
perspective = CATransform3DRotate(perspective, CGFloat(-Double.pi / 4), 0, 1, 0)
print(perspective)
self.view.layer.sublayerTransform = perspective
//add cube face 1
var transform: CATransform3D = CATransform3DMakeTranslation(0, 0, 50)
addFace(0, withTransform: transform)
//add cube face 2
transform = CATransform3DMakeTranslation(50, 0, 0)
transform = CATransform3DRotate(transform, CGFloat(Double.pi / 2), 0, 1, 0)
addFace(1, withTransform: transform)
//add cube face 3
transform = CATransform3DMakeTranslation(0, -50, 0)
transform = CATransform3DRotate(transform, CGFloat(Double.pi / 2), 1, 0, 0)
addFace(2, withTransform: transform)
Функция addFace
func addFace(_ index: Int, withTransform transform: CATransform3D) {
let face: UIView? = faces[index]
if let aFace = face {
self.view.addSubview(aFace)
}
let containerSize: CGSize? = self.view.bounds.size
face?.center = CGPoint(x: (containerSize?.width ?? 0.0) / 2.0, y: (containerSize?.height ?? 0.0) / 2.0)
face?.layer.transform = transform
}
Выход
Ответ 2
Похоже, вам нужно, чтобы жесты вращали куб для настройки коллажа. Поэтому вы не можете пойти на UIKit только для достижения того же.
Преобразование из координат UIKit в координаты SceneKit является сложным в ваших требованиях.
Вместо этого вам нужно использовать SceneKit, а также UIKit для того, чтобы это было сделано.
Выполните следующие шаги
Создание пользовательского интерфейса куба с помощью SceneKit
import UIKit
import SceneKit
class ViewController: UIViewController {
@IBOutlet weak var mySceneView: SCNView!
override func viewDidLoad() {
super.viewDidLoad()
mySceneView.allowsCameraControl = true
//Create instance of scene
let scene = SCNScene()
mySceneView.scene = scene
//Add cube to scnview
AddCubeToScene()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func AddCubeToScene()
{
//Create a box of size 0.1 * 0.1 * 0.1
let myBox = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
myBox.firstMaterial?.diffuse.contents = UIColor.red
myBox.firstMaterial?.isDoubleSided = true
//Create SCnnode of from geometry and specified its position
let cubeNode = SCNNode(geometry: myBox)
//Add created scnnode to scene
mySceneView.scene?.rootNode.addChildNode(cubeNode)
}
}
Создайте UIScrollView с помощью UIKit
weak var scrollView: UIScrollView?
override func viewDidLoad() {
super.viewDidLoad()
let scrollView = UIScrollView(frame: CGRect.zero)
scrollView.contentSize = contentSize
scrollView.delegate = self
scrollView.minimumZoomScale = 1
scrollView.maximumZoomScale = 3
scrollView.indicatorStyle = .white
self.scrollView = scrollView
let clearContentView = UIView(frame: CGRect(x: 0, y: 0, width: contentSize.width, height: contentSize.height))
clearContentView.backgroundColor = UIColor.clear
scrollView.addSubview(clearContentView)
self.clearContentView = clearContentView
clearContentView.addObserver(self, forKeyPath: "transform", options: .new, context: &ViewTransformChangedObservationContext)
skView.addSubview(scrollView)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
scrollView?.frame = view.bounds
scene?.size = view.bounds.size
if let scrollView = scrollView {
adjustContent(scrollView: scrollView)
}
}
func adjustContent(scrollView: UIScrollView) {
let zoomScale = scrollView.zoomScale
scene?.setContentScale(scale: zoomScale)
let contentOffset = scrollView.contentOffset
let contentSize = scrollView.contentSize
let scrollAreaHeight: CGFloat = contentSize.height - scrollView.bounds.height
let yUIKit: CGFloat = contentOffset.y
// Convert from UIKit coordinates to SpriteKit coordinates
// UIKit has 0,0 in the top-left corner
// SpriteKit has 0,0 in the bottom-left corner
let ySpriteKit = scrollAreaHeight - yUIKit
let contentOffsetSpriteKit = CGPoint(x: contentOffset.x, y: ySpriteKit)
scene?.contentOffset = contentOffsetSpriteKit
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
adjustContent(scrollView: scrollView)
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return clearContentView
}
func scrollViewDidTransform(scrollView: UIScrollView) {
adjustContent(scrollView: scrollView)
}
// scale between minimum and maximum. called after any 'bounce' animations
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
adjustContent(scrollView: scrollView)
}
Теперь добавьте экземпляры UIScrollView
в каждую сторону куба (то есть, дочерние элементы)
Ты здесь!
Ответ 3
Решение, которое вы ищете, может быть основой. Вы можете взглянуть на эти проекты с открытым исходным кодом. MKCubeController, CubeController и Gemini.
CubeController - это тот, который наиболее близок к вашему требованию, возможно, вам придется немного изменить их. Близнецы также имеют реализацию куба.