ios - UIView bounds.applying 但有旋转
问题描述
我想在视图周围创建一个虚线边框,可以移动/旋转/缩放。
这是我的代码:
func addBorder() {
let f = selectedObject.bounds.applying(selectedObject.transform)
borderView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.5) //just for testing
borderView.frame = f
borderView.center = selectedObject.center
borderView.transform = CGAffineTransform(translationX: selectedObject.transform.tx, y: selectedObject.transform.ty)
removeBorder() //remove old border
let f2 = CGRect(x: 0, y: 0, width: borderView.frame.width, height: borderView.frame.height)
let dashedBorder = CAShapeLayer()
dashedBorder.strokeColor = UIColor.black.cgColor
dashedBorder.lineDashPattern = [2, 2]
dashedBorder.frame = f2
dashedBorder.fillColor = nil
dashedBorder.path = UIBezierPath(rect: f2).cgPath
dashedBorder.name = "border"
borderView.layer.addSublayer(dashedBorder)
}
这还不错,但我希望边框也可以旋转,因为它可能会误导用户,因为触摸区域仅在图像上。
我试图将旋转应用于变换:
func addBorder() {
let f = selectedObject.bounds.applying(selectedObject.transform)
borderView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.5) //just for testing
borderView.frame = f
borderView.center = selectedObject.center
let rotation = atan2(selectedObject.transform.b, selectedObject.transform.a)
borderView.transform = CGAffineTransform(rotationAngle: rotation).translatedBy(x: selectedObject.transform.tx, y: selectedObject.transform.ty)
removeBorder() //remove old border
let f2 = CGRect(x: 0, y: 0, width: borderView.frame.width, height: borderView.frame.height)
let dashedBorder = CAShapeLayer()
dashedBorder.strokeColor = UIColor.black.cgColor
dashedBorder.lineDashPattern = [2, 2]
dashedBorder.frame = f2
dashedBorder.fillColor = nil
dashedBorder.path = UIBezierPath(rect: f2).cgPath
dashedBorder.name = "border"
borderView.layer.addSublayer(dashedBorder)
}
但旋转后它看起来像这样:
我怎样才能解决这个问题?
解决方案
这是一个基于您应该执行的代码的示例:
//initial transforms
selectedObject.transform = CGAffineTransform.init(rotationAngle: .pi / 4).translatedBy(x: 150, y: 15)
func addBorder() {
let borderView = UIView.init(frame: selectedObject.bounds)
self.view.addSubview(borderView)
borderView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.5) //just for testing
borderView.center = selectedObject.center
borderView.transform = selectedObject.transform
removeBorder() //remove old border
let dashedBorder = CAShapeLayer()
dashedBorder.strokeColor = UIColor.black.cgColor
dashedBorder.lineDashPattern = [2, 2]
dashedBorder.fillColor = nil
dashedBorder.path = UIBezierPath(rect: borderView.bounds).cgPath
dashedBorder.name = "border"
borderView.layer.addSublayer(dashedBorder)
}
推荐阅读
- python-3.x - 状态更改为活动后,Tkinter 按钮未更改回正确的颜色
- r - 如何使用 dplyr 和 shift 添加新列并计算递归 cum
- node.js - 带有时间戳的 Winson 不添加时间戳
- c++ - 当我尝试运行我的 c++ 程序时,它说“使用未声明的标识符”,但它在标题中声明
- python - “ValueError : list.remove(x): x not in list”当 x 在列表中时
- repository - 安装 RCU for Oracle Data Integrator 运行时出错
- ios - Swift - 在 UIStackView 中以编程方式创建 UIPickerView
- android - 如何使用 FusedLocationProviderClient 获取当前位置
- python - 如何将值的数组列表移动到 Pandas DataFrame 中的不同列中?
- javascript - 基于过滤器的mongoose聚合模型