Как программно поворачивать группу кнопок в 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 отключен. Проверьте это, если вы хотите поддерживать вращение вверх ногами.