Как программно поворачивать группу кнопок в Swift?

Я пытаюсь организовать пронумерованные кнопки программно по кругу. NSLayoutConstraint фиксирует представление, а subClass из UIView создает круг кнопок. Рама вращается вокруг центра, но кнопки вращаются непоследовательно. Текстовая ориентация одинакова во всех случаях, кроме одного поворота.

  for example

введите описание изображения здесь

Мой код быстрого оформления для кнопок управления улучшает более раннее усилие в Objective C. Я также рассмотрел несколько полезных советов для поворота представления о центре экрана, включая этот.

Буду признателен, если кто-нибудь покажет мне, как улучшить мой код, чтобы пользовательский интерфейс был согласован для каждого размера и ориентации экрана.

Вот 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])
    }
}

... и подкласс 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+)!

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override init(frame: CGRect) {
    super.init(frame: frame)

    drawUberCircle()
    drawBoundaryCircles()
}

... вторая последняя функция рисует цветной круговой фон

    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
}

... в то время как последняя функция рисует кнопки по круговой дуге

    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.red, 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")
    }
}

ИЗМЕНИТЬ

Вращение 4 (показано выше) появляется, когда iPhone держится вверх ногами и не имеет значения по причинам, объясненным в принятом ответе (см. ниже). Это становится более очевидным, если код работает на реальном устройстве, а не на симуляторе.

РЕШЕНИЕ С РАБОЧИМ КНОПКИ

Для решения с кнопками, которые остаются в центре и работают, обратитесь к this

Ответы

Ответ 1

Для iphone это поведение верное. Обычно вы не поддерживаете поворот вверх ногами, потому что это путает, если пользователь должен отвечать на вызов; его в руководстве Apple HIG. Посмотрите настройки своего проекта на общей вкладке в соответствии с ориентацией устройства. По умолчанию Upside Down отключен. Проверьте это, если вы хотите поддерживать вращение вверх ногами.