Создание собственной кнопки в SwiftUI - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь нарисовать следующую картинку с каждым сегментом круга, состоящим из 3 кнопок, на которые можно нажать.

See picture

Я скопировал код с этого форума, нокогда я пытаюсь его использовать, я получаю сообщение об ошибке, и код не компилируется. Пробовал разные версии (последняя напечатана), но ни одна из них не работает. Что я делаю неправильно? Кроме того, будут ли целые числа i и j переданы в вызов класса CustomShapeButton?

import SwiftUI
import UIKit

struct ContentView: View {

    static let segmentCount = 4
    static let circleCount = 4

    var i: Int = 0
    var j: Int = 0
    var NewButtons: CustomShapeButton

    var body: some View {
        ZStack {
            ForEach(1..<ContentView.circleCount){ j in
                ForEach(1..<ContentView.segmentCount){ i in
                    NewButtons = CustomShapeButton()
                }
            }
        }
    }
}


class CustomShapeButton: UIButton {

    lazy var pantsShapeBezierPath: UIBezierPath = {
        // Crate new path
        let path = UIBezierPath()

        var r = CGFloat(75.0)
        r = CGFloat(50.0 + (CGFloat(j) - 1.0) * 50.0)
        let center_x = CGFloat(200.0)
        let center_y = CGFloat(200.0)
        var arc_start = CGFloat(45.0 * CGFloat(Double.pi) / 180.0)
        arc_start = CGFloat((45.0 + (CGFloat(i) - 1.0) * 90.0)) * CGFloat(Double.pi) / 180.0

        let arc_length = CGFloat(90.0 * CGFloat(Double.pi) / 180.0)
        let arc_width = CGFloat(45.0)
        let line0Target_x = center_x + r * CGFloat(cos(Double(arc_start)))
        let line0Target_y = center_y + r * CGFloat(sin(Double(arc_start)))
        let line1Target_x = center_x + (r + arc_width) * CGFloat(cos(Double(arc_start + arc_length)))
        let line1Target_y = center_x + (r + arc_width) * CGFloat(sin(Double(arc_start + arc_length)))

        path.move(to: CGPoint(x: line0Target_x, y: line0Target_y))
        path.addArc(center: CGPoint(x: center_x, y: center_y), radius: r, startAngle: Angle(radians: Double(arc_start)), endAngle: Angle(radians: Double(arc_start + arc_length)), clockwise: false)
        path.addLine(to: CGPoint(x: line1Target_x, y: line1Target_y))
        path.addArc(center: CGPoint(x: center_x, y: center_y), radius: (r + arc_width), startAngle: Angle(radians: Double(arc_start + arc_length)), endAngle: Angle(radians: Double(arc_start)), clockwise: true)
        path.addLine(to: CGPoint(x: line0Target_x, y: line0Target_y))
        path.close()

        return path
    }()

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        // Set shape filling color
        UIColor.red.setFill()

        // Fill the shape
        pantsShapeBezierPath.fill()
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        // Handling touch events

        if (pantsShapeBezierPath.contains(point)) {
            return self

        } else {
            return nil
        }
    }

1 Ответ

0 голосов
/ 09 октября 2019

Ваш код неправильно смешивает UIKit и SwiftUI. Вы не можете сделать это в операторе body:

NewButtons = CustomShapeButton()

Все внутри функции body должно быть View. Это оператор присваивания.

Далее CustomShapeButton является подклассом UIButton. Вы также не можете использовать это здесь. Если вы хотите использовать этот случайный интернет-код (который я не предлагаю), вам придется обернуть его внутри UIViewRepresentable. Вместо этого подумайте о том, как следовать руководству Apple о том, как создавать пользовательские траектории на основе View s.

https://developer.apple.com/tutorials/swiftui/drawing-paths-and-shapes

Как только вы сможете нарисовать нужные фигуры, оберните их в Button:

Button(action: { /* do your action */ }) {
    CircularCutoutShape()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...