在 Swift 中绘制对角线

Posted

技术标签:

【中文标题】在 Swift 中绘制对角线【英文标题】:Drawing a Diagonal Line in Swift 【发布时间】:2015-09-09 16:10:41 【问题描述】:

我想知道是否可以使用 UIViews 绘制对角线?我已经成功地画了一条直线(垂直/水平),但我找不到旋转直线的方法。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

这是一个在 Swift 2 中包含对角线视图的视图的基本示例。当视图的边界发生变化时,通过调整对角线的长度和旋转角度来调整对角线。

import UIKit
import Foundation

class ViewWithDiagonalLine: UIView 

    private let line: UIView

    private var lengthConstraint: NSLayoutConstraint!

    init() 
        // Initialize line view
        line = UIView()
        line.translatesAutoresizingMaskIntoConstraints = false
        line.backgroundColor = UIColor.redColor()

        super.init(frame: CGRectZero)

        clipsToBounds = true // Cut off everything outside the view

        // Add and layout the line view

        addSubview(line)

        // Define line width
        line.addConstraint(NSLayoutConstraint(item: line, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 10))

        // Set up line length constraint
        lengthConstraint = NSLayoutConstraint(item: line, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0)
        addConstraint(lengthConstraint)

        // Center line in view
        addConstraint(NSLayoutConstraint(item: line, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1, constant: 0))
        addConstraint(NSLayoutConstraint(item: line, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .CenterY, multiplier: 1, constant: 0))
    

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

    override func layoutSubviews() 
        super.layoutSubviews()

        // Update length constraint and rotation angle
        lengthConstraint.constant = sqrt(pow(frame.size.width, 2) + pow(frame.size.height, 2))
        line.transform = CGAffineTransformMakeRotation(atan2(frame.size.height, frame.size.width))
    


出于演示目的将其放入普通视图控制器中

class ViewController: UIViewController 

    override func viewDidLoad() 
        let v = ViewWithDiagonalLine()
        v.frame = CGRectMake(100, 100, 100, 200)
        v.layer.borderColor = UIColor.blueColor().CGColor
        v.layer.borderWidth = 1
        view.addSubview(v)
    


产生结果

【讨论】:

壮观而翔实的答案。两个快速修复 - line.translatesAutoresizingMaskIntoConstraints 不是属性...而是将其更改为函数并使用:line.setTranslatesAutoresizingMaskIntoConstraints(false)。其次,删除 ?在所需的 init?(coder aDecoder: NSCoder) .否则它会完美运行!谢谢! :) @alex1511 抱歉,我忘了说我的答案中的代码是针对 Swift 2 的。如果你想在 Swift 1.2 中使用它,你确实需要你提到的那些适应。 还有一个问题:目前只能画一条从左上到右下的线……我怎么才能从右上到左下画呢? @alex1511 只需将角度计算改为CGFloat(M_PI) - atan2(frame.size.height, frame.size.width)即可。 还有一个后续问题!绘制后如何删除线...我尝试过 line1.hidden 甚至尝试删除 line1 的所有子视图,但似乎没有任何效果。【参考方案2】:

您可以通过设置transform 属性来旋转UIView。你会想使用CGAffineTransformMakeRotationCGAffineTransformRotate

但是,您最好使用CAShapeLayer 并将其path 属性设置为您要绘制的线。

【讨论】:

以上是关于在 Swift 中绘制对角线的主要内容,如果未能解决你的问题,请参考以下文章

使用CSS在div背景中绘制对角线

itextsharp C#:如何在表格单元格内绘制对角线

在 Seaborn Jointplot 上绘制对角线(相等线)

在 WPF 中相对于其容器绘制对角文本/文本块/标签/控件

在位图上绘制对角线文本

在窗体上绘制一条对角线,在调整窗体大小时重绘