如何在 Swift 中以编程方式旋转一组按钮?

2023-12-14

我正在尝试以编程方式将编号按钮排列在一个圆圈中。 NSLayoutConstraint 锚定视图,而 UIView 的子类创建按钮圈。框架绕中心旋转,但按钮旋转不一致。除一次旋转外,所有旋转中的文本方向均相同。

  for example

enter image description here

我用于排列按钮的 Swift 代码得到了改进Objective C 的早期成果。我还跟进了一些关于围绕屏幕中心旋转视图的有用建议,包括this one.

如果有人能告诉我如何改进我的代码,使 UI 对于每个屏幕尺寸和方向都保持一致,我将不胜感激。

这里是视图控制器

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")
    }
}

EDIT

旋转 4 (如上所示)当 iPhone 被倒置时出现,并且由于接受的答案中解释的原因而无关紧要(见下文)。如果代码在实际设备而不是模拟器上运行,这一点会变得更加明显。

带有工作按钮的解决方案

对于按钮保持在中心位置的解决方案and工作,参考this


对于 iPhone 来说,这种行为是正确的。您通常不支持颠倒旋转,因为如果用户必须接听电话,这会让人感到困惑;它在苹果 HIG 指南中。在设备方向下的常规选项卡上查看您的项目设置。默认情况下,颠倒功能被禁用。如果您想支持颠倒旋转,请选中它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中以编程方式旋转一组按钮? 的相关文章

  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • Swift 协议扩展实现另一个具有共享关联类型的协议

    考虑以下 protocol Foo typealias A func hello gt A protocol FooBar Foo func hi gt A extension FooBar func hello gt A return h
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • React-native-vision-camera无法访问后面的普通摄像头

    我正在尝试在 iPhone 11 Pro 上使用 普通 相机 我使用反应本机视觉相机 当我运行这段代码时 const devices useCameraDevices const deviceBack devices back consol
  • 如何制作带有 SWIFT 图像的弹出窗口

    我想知道如何制作类似于此示例的弹出窗口 原始窗口充满了按钮 选择这些按钮后将拉出我想要使用的图像 我会简单地创建一个可重用的UIView组件以及作为子视图所需的一切 例如UIImageView为了你的形象 UILabel or a UIBu
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • watchOS 错误:控制器接口描述中的未知属性

    我将 WKInterfacePicker 添加到情节提要中 并将其连接到界面控制器中的 IBOutlet 运行应用程序时 它在控制台中显示一条错误消息 控制器的接口描述 watchPicker 中的未知属性 Code interface I
  • 如何在button.addTarget操作中发送多个按钮?斯威夫特3

    如何将button和button2发送到我的pressButton2函数中 当用户触摸按钮2时 我需要更改按钮和按钮2的颜色 当我的 button2 addTarget 看起来像这样时 我收到错误 表达式列表中存在预期表达式 import
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • 如何使用 RX 应用宽限时间?

    我有一个Observable
  • CoreBluetooth:检测设备超出范围/连接超时

    我正在设计一个 iOS 框架来处理多个 BLE 设备 均为同一类型 目前一切都运行良好 除了一件事 客户想要一个包含可用设备的列表 但是 我如何检测过去发现的设备何时不再可用 当我尝试连接到不再可用的设备时 会出现另一个问题 文档说 连接尝
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • 更改 iOS7 中 UIAlertView 的字体大小

    我想更改alertView中消息文本和标题文本的字体大小 苹果网站上没有任何文档谈到这一点 但苹果在其子类注释中表示 UIAlertView 类旨在按原样使用 请参考以下链接 https developer apple com librar
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • 如何使用控制台开发工具更新 Angular 4+ 表单值?

    我正在尝试使用控制台 开发工具 填写 Angular 4 表单 这就是我现在正在做的事情 function fillForm let el document querySelector input ng reflect name my in
  • 多个异步/等待链

    如何在 C 中进行多个 async await 链接 例如 启动几个 HTTP 请求 然后不等待所有请求 而是在每个请求完成后启动新请求 最简单的方法是编写一个async method async Task DownloadAndFollo
  • Pytorch几何稀疏邻接矩阵到边缘索引张量

    我的数据对象有data adj t参数 给我稀疏邻接矩阵 我怎样才能得到edge index大小张量 2 num edges 由此 正如你在docs 由于此功能仍处于实验阶段 一些操作 e g 图池方法 可能仍然需要您输入edge inde
  • 对动态数据透视列进行排序

    我有以下 SQL 查询 其中创建的列是无序的 我不太确定如何修复它 SELECT rhead rhcust AS Cust ID rdetl rdextp AS Inv Amt rhead rhivdt AS Inv Date INTO T
  • 测试java HBase连接

    我正在尝试使用 HBase Java API 将数据写入 HBase 我通过 Ambari 安装了 Hadoop HBase 以下是当前设置配置的方式 final Configuration CONFIGURATION HBaseConfi
  • 如何以编程方式安装 Android 应用程序而不提示,

    我正在尝试在没有提示的情况下以编程方式安装该应用程序 意味着安装应用程序时不会显示用户必须按下的弹出窗口install选项 我跟着THIS回答 但每当我运行代码时 它都会抛出错误 java io IOException 运行 exec 时出
  • 如何使用 Cloudformation 在 AWS WAF 中启用 WebACL 日志记录?

    我正在经历AWS WAF 云信息文档 我找不到启用日志记录的方法 我可以通过控制台启用日志记录 但我想通过 Cloudformation 来执行此操作 以便在新堆栈中默认启用它 如何通过 Cloudformation 在 AWS WAF W
  • MS Office 2007 文件的 PHP 5.3.5 fileinfo() MIME 类型 - magic.mime 更新?

    在 PHP 上传中 我尝试验证正在上传的文件的 MIME 类型 以匹配应用程序的一组有效的 MIME 类型 当尝试使用 fileinfo 确定 Office 2007 文件的 MIME 类型时 它没有检测到相应的 MIME 类型 相反 MI
  • 带 React Hooks 的可重用下拉菜单

    正如我从 React 文档中得到的那样 使用钩子不需要大量代码重构 并且可以轻松包含在现有代码中 我想制作可重用的下拉菜单 从反应组件渲染方法调用 这是我的代码 navigation js import DropdownToggler fr
  • Regex.Replace 拒绝用换行符替换

    您好 我编写了一个非常简单的 C 程序 从命令行使用 C Regex 而不是依赖于 MS Word 搜索和替换 问题是 即使正则表达式可以很好地识别 r 和 n 当我尝试用其中任何一个替换字符串时 它似乎用转义字符而不是字符本身替换它 ST
  • 如何为 System.out.println 输出着色? [复制]

    这个问题在这里已经有答案了 如何为 Java 输出着色 例如 在 C 和其他语言中 我可以使用 ANSI escape 例如 033 0m去做这个 但在Java中它不起作用 public static void main String x
  • Git checkout:更新路径与切换分支不兼容

    我的问题与切换分支时发生致命 Git 错误 我尝试使用命令获取远程分支 git checkout b local name origin remote name 但我收到此错误消息 致命 git checkout 更新路径与切换分支不兼容
  • 使用 jQuery 更改背景颜色

    我正在尝试使用 jQuery 更改背景颜色 我究竟做错了什么 我知道使用 CSS 可以更轻松地完成此操作 但我正在尝试使用 jQuery 来完成此操作 Link to jsfiddle 我正在尝试将 Hi 的背景更改为黄色 window o
  • 在绑定中使用 StringFormat 显示带空格的十六进制值

    我一直无法弄清楚如何使用 StringFormat 将十六进制显示为 08 A4 23 F5 具体来说 我想要每 2 个字符后面有一个空格 当我这样做时 Text Binding MyIntValue StringFormat 0 x 它看
  • 正则表达式使电子邮件域因两个连续点而失败

    我正在尝试验证电子邮件的域部分 并且我想检查域中是否没有两个连续的点 即以下内容无效 电子邮件受保护 电子邮件受保护 电子邮件受保护 电子邮件受保护 我有正则表达式来找到它 2 2 但我在 NET 中使用正则表达式属性 并且想要构建有效的正
  • 单击哪个按钮打开表单

    我有一个表单 可以通过单击三个按钮 添加 修改或删除 中的任何一个来加载 当表单加载时 有一个 确认 按钮 该按钮将根据最初用于显示表单的按钮来执行任务 有没有一种简单的方法来确定最初单击的是哪个按钮 以便执行正确的代码 Thanks 好吧
  • 使用 PHP 操作内存中的存档(无需在磁盘上创建临时文件)

    我正在尝试用 PHP 即时生成存档并立即将其发送给用户 不保存 我认为不需要在磁盘上创建文件 因为我发送的数据无论如何都不是持久的 但是 在搜索网络时 我无法找到如何创建文件 我也不关心文件格式 所以 问题是 是否可以在 php 脚本中创建
  • 如何设置int值为null? Java Android [重复]

    这个问题在这里已经有答案了 这是设置已定义的最佳方式int to null private int xy int x 5 x null this is ERROR return x 所以我选择这个 private int xy Intege
  • 在 JOptionPane 中将文本右对齐

    是否可以在 JOptionPane 中将文本向右对齐 我不想使用JDialog 因为我想用阿拉伯语写一些句子 创建一个 JPanel 在 JPanel 中对齐文本 然后将 JPanel 添加为 JOptionPane 的 Object 参数
  • 如何在 Swift 中以编程方式旋转一组按钮?

    我正在尝试以编程方式将编号按钮排列在一个圆圈中 NSLayoutConstraint 锚定视图 而 UIView 的子类创建按钮圈 框架绕中心旋转 但按钮旋转不一致 除一次旋转外 所有旋转中的文本方向均相同 for example 我用于排