【问题标题】:How to create circular and triangular buttons如何创建圆形和三角形按钮
【发布时间】:2017-05-23 14:25:43
【问题描述】:

下面我附上了我目前用于在 Swift 2、Xcode 7 中创建蓝色按钮的代码

我想知道是否有办法将按钮创建为三角形和圆形。

    let btn = UIButton(type: UIButtonType.System) as UIButton        
    btn.backgroundColor = UIColor.blueColor()
    btn.setTitle("CALL TPT AGENT", forState: UIControlState.Normal)
    btn.frame = CGRectMake(100, 100, 200, 100)
    btn.addTarget(self, action: "clickMe:", forControlEvents: UIControlEvents.TouchUpInside)
    self.view.addSubview(btn)

任何帮助将不胜感激;)

【问题讨论】:

  • 你知道贝塞尔路径吗?对于圆形,您可以使用 btn.layer.cornerRadius 给出一些值(如果您的框架是正方形,则值是高度或宽度的一半)
  • 谢谢,我工作了。然而,在添加这个 - 'btn.layer.cornerRadius = 50' 并点击它之后,应用程序崩溃了。你知道发生了什么事吗? @Ramkumarchintala
  • 你可以在这里添加崩溃日志
  • 我的崩溃日志一直被破坏,所以它只是显示“无法附加”...您在代码中看到任何可能导致此问题的内容吗? @Ramkumarchintala

标签: ios swift uibutton swift2 xcode7


【解决方案1】:

我总是通过设置btn.layer.cornerRadius = btn.frame.height / 2 来制作圆形按钮,这样无论按钮多高,按钮末端总是圆形的。如果你想要一个圆圈,请将宽度和高度设置为相同的值。

【讨论】:

    【解决方案2】:

    为什么不创建三角形和圆形图像(使用图像文件或动态)然后相应地设置按钮图像:

    enum Shape {
        case Triangle, Circle
    }
    
    class ShapeButton : UIButton
    {
        var shapeColor:UIColor!
        var buttonShape:Shape!
    }
    
    class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let button1  = UIButton(type:  .custom)
        button1.frame = CGRect(x:100, y:50, width:50, height:50)
        if let image = UIImage(named:"circle.png") {
            button1.setImage(image, for: .normal)
        }
        self.view.addSubview(button1)
    
        let button2  = ShapeButton(type:  .custom)
        button2.shapeColor = UIColor.red
        button2.buttonShape = Shape.Triangle
        button2.frame = CGRect(x:50, y:50, width:50, height:50)
        if let image = drawCustomImage(size:button2.frame.size,imageShape: button2.buttonShape,color:button2.shapeColor) {
            button2.setImage(image, for: .normal)
        }
        self.view.addSubview(button2)
    
        let button3  = ShapeButton(type:  .custom)
        button3.buttonShape = Shape.Circle
        button3.shapeColor = UIColor.green
        button3.frame = CGRect(x:150, y:50, width:50, height:50)
        if let image = drawCustomImage(size:button3.frame.size,imageShape: button3.buttonShape,color:button3.shapeColor) {
            button3.setImage(image, for: .normal)
        }
        self.view.addSubview(button3)
    
    }
    
    func drawCustomImage(size: CGSize,imageShape:Shape,color:UIColor) -> UIImage? {
        // Setup our context
        let bounds = CGRect(origin: CGPoint.zero, size: size)
        let opaque = false
        let scale: CGFloat = 0
        UIGraphicsBeginImageContextWithOptions(size, opaque, scale)
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
    
        // Setup complete, do drawing here
        context.setStrokeColor(color.cgColor) //UIColor.red.cgColor
        context.setLineWidth(1)
    
        // Would draw a border around the rectangle
        // context.stroke(bounds)
    
        context.beginPath()
        if imageShape == Shape.Triangle {
            context.move(to: CGPoint(x: bounds.minX, y: bounds.maxY))
            context.addLine(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
            context.addLine(to: CGPoint(x: bounds.maxX/2, y: bounds.minY))
            context.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY))
        } else {
            context.addEllipse(in: bounds)
        }
        context.closePath()
    
        context.setFillColor(color.cgColor)
        context.fillPath()
    
        // Drawing complete, retrieve the finished image and cleanup
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    
    }
    

    【讨论】:

    • 谢谢,那将是最好的选择,但我需要能够识别和更改形状的颜色,并且在代码中的字典中包含所有颜色会更容易。
    • 编辑了我的答案 - 添加了继承自 UIButton 的 ShapeButton,添加了形状和颜色属性。更新 drawCustomImage 以绘制三角形或圆形。
    【解决方案3】:

    对于圆形按钮,在您的viewDidLoad():

    yourButton.layer.cornerRadius = 90
    

    对于三角形按钮,这可能会有所帮助:Swiftiotutorials - Nice Triangle View Border

    【讨论】:

    • 要添加到这个答案,请确保您的按钮约束设置为 1:1,否则这可能不会给您一个圆圈。
    • @Jerland2 是的,抱歉,我忘记提了!
    • 谢谢!按钮约束是否自动设置为 1:1?
    • @Nosh 通过 1:1 约束我们的意思是按钮的高度和宽度几乎相等
    • 老兄!我们不会中文! ?(好像变了)
    【解决方案4】:

    要画一个三角形,这里是代码

    let trianglePath = UIBezierPath()
    let triangleLayer = CAShapeLayer()
    //change the CGPoint values to get the triangle of the shape you want
    trianglePath.move(to: CGPoint(x: 0, y: 0))
    trianglePath.addLine(to: CGPoint(x: 100, y: 50))
    trianglePath.addLine(to: CGPoint(x: 0, y: 100))
    trianglePath.addLine(to: CGPoint(x: 0, y: 0))
    
    triangleLayer.path = trianglePath.cgPath
    triangleLayer.fillColor = UIColor.black.cgColor
    
    btn.layer.addSublayer(triangleLayer)
    

    【讨论】:

    • 另外,无论我多么努力,我似乎​​都无法让三角形成为等边且正面朝上...有什么帮助吗? :)
    • @Nosh 让你的点之间的距离为 x,你需要你的“中线”的长度为 √3 / 2 * x 这意味着你的点应该有这些坐标:(0, 0 )
    • 这里是坐标 (0, 0) (50, 86.6) (100, 0) 和回到 (0, 0) 让三角形指向相反的方向: (0, 86.6) (100, 86.6) (50, 86.6) 并返回 (0, 86.6) 告诉我这些方向是否适合您
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多