¿Cómo rotar un grupo de botones mediante progtwigción en Swift?

Estoy tratando de organizar los botones numerados programáticamente en un círculo. NSLayoutConstraint ancla la vista mientras que una subclass de UIView crea el círculo de botones. El marco gira alnetworkingedor del centro pero los botones giran de manera inconsistente. La orientación del text es la misma en todas las rotaciones, less una.

for example 

introduzca la descripción de la imagen aquí

Mi código Swift para organizar botones mejora en un esfuerzo anterior en el Objetivo C. También he seguido algunas sugerencias útiles para rotar una vista sobre el centro de la pantalla, incluida esta .

Agradecería que alguien me muestre cómo mejorar mi código para que la interfaz de usuario sea consistente para cada tamaño y orientación de pantalla.

Aquí está el Viewcontroller

 import UIKit class ViewController: UIViewController { var circle: CircleView? override func viewDidLoad() { super.viewDidLoad() let circle = CircleView() circle.translatesAutoresizingMaskIntoConstraints = false view.addSubview(circle) let horizontalConstraint = circle.centerXAnchor.constraint(equalTo: view.centerXAnchor) let verticalConstraint = circle.centerYAnchor.constraint(equalTo: view.centerYAnchor) NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint]) } } 

… y la subclass de UIView

 import UIKit class CircleView: UIView { // MARK: Initialization let points: Int = 10 // 80 25 16 10 5 let dotSize: CGFloat = 60 // 12 35 50 60 100 let radius: CGFloat = 48 // 72 70 64 48 45 var arcPoint = CGFloat(M_PI * -0.5) // clockwise from 12+ (not 3+)! requinetworking init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(frame: CGRect) { super.init(frame: frame) drawUberCircle() drawBoundaryCircles() } 

… la segunda última function dibuja el background circular de color

  func drawUberCircle() { // Create a CAShapeLayer let shapeLayer = CAShapeLayer() // give Bezier path layer properties shapeLayer.path = createBezierPath().cgPath shapeLayer.strokeColor = UIColor.cyan.cgColor shapeLayer.fillColor = UIColor.cyan.cgColor shapeLayer.lineWidth = 1.0 self.layer.addSublayer(shapeLayer) } func createBezierPath() -> UIBezierPath { let path = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: radius * 2, startAngle: CGFloat(M_PI * -0.5), endAngle: CGFloat(M_PI * 1.5), clockwise: true) return path } 

… mientras que la última function dibuja botones en un arco circular

  func drawBoundaryCircles() { for index in 1...points { let point: CGPoint = makeBoundaryPoint() drawButton(point: point, index: index) } } func makeBoundaryPoint() -> (CGPoint) { arcPoint += arcAngle() print(arcPoint) let point = CGPoint(x: 0 + (radius * 2 * cos(arcPoint)), y: 0 + (radius * 2 * sin(arcPoint))) return (point) } func arcAngle() -> CGFloat { return CGFloat(2.0 * M_PI) / CGFloat(points) } func drawButton(point: CGPoint, index: Int) { let myButton = UIButton(type: .custom) as UIButton myButton.frame = CGRect(x: point.x - (dotSize/2), y: point.y - (dotSize/2), width: dotSize, height: dotSize) myButton.backgroundColor = UIColor.white myButton.layer.cornerRadius = dotSize / 2 myButton.layer.borderWidth = 1 myButton.layer.borderColor = UIColor.black.cgColor myButton.clipsToBounds = true myButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Thin", size: dotSize/2) myButton.setTitleColor(UIColor.networking, for: .normal) myButton.setTitle(String(index), for: .normal) myButton.tag = index; myButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) addSubview(myButton) } func buttonAction(myButton: UIButton) { let sender:UIButton = myButton print("Button \(sender.tag) was tapped") } } 

EDITAR

La rotation 4 (que se muestra arriba ) aparece cuando el iPhone se mantiene al revés y es irrelevante por razones explicadas en la respuesta aceptada ( ver a continuación ). Esto se vuelve más obvio si el código se ejecuta en un dispositivo real en lugar del simulador.

UNA SOLUCIÓN CON BOTONES DE TRABAJO

Para get una solución con botones que permanecen en el centro y funcionan, consulte este

Para un iPhone, este comportamiento es correcto. Por lo general, no admite la rotation invertida porque confunde si el usuario tiene que contestar una llamada; está en las pautas de HIG de manzana. Mire las configuraciones de su proyecto en la pestaña general bajo orientación del dispositivo. De forma pnetworkingeterminada, el modo Upside Down está deshabilitado. Verifique si desea admitir la rotation invertida.