Nano Hash - криптовалюты, майнинг, программирование

Как отображать UIButtons в пути

Есть ли простой способ программно создавать UIButtons и отображать их по заданному пути, например:

UIBUTTON -> UIBUTTON -> UIBUTTON
                            |
                            v
UIBUTTON <- UIBUTTON <- UIBUTTON
|
v
UIBUTTON -> UIBUTTON -> UNBUTTON


  for i  in 0...array.count - 1 {

            let button = UIButton(frame: CGRectMake(CGFloat(i) * 74 + 10, 5, 64, 64))

            // some other stuff
            //.....


            containerView.addSubview(label)

но это продолжается вечно только в одном направлении (x)....

ИЗМЕНИТЬ:

Мне удалось добавить кнопки в соответствии с вашим предложением. Теперь у меня есть еще одна проблема, которую я частично решил, но я был бы признателен за ваш вклад.

Мне нужно соединить эти кнопки линией, но есть проблемы, как вы можете видеть на скриншоте. Мне нужно, чтобы последняя строка шла вертикально (зеленые круги). Какие-либо предложения?

вот код:

 @IBAction func drawButtons (sender: AnyObject) {

        buttonContainerView.removeFromSuperview() // Clear containerView
        buttonContainerView = UIView() // Create a new instance

        let buttonCount = array.count
        let n = Int(self.view.frame.size.width) / 90 //check how many buttons can fit in the screen
        let buttonsPerRow = n

        let horizontalSpace: CGFloat = 80
        let verticalSpace: CGFloat = 80

        // Create the alignment points
        var points = [CGPointZero]
        var direction: CGFloat =  1

        for i in 1..<buttonCount {
            let previousPoint = points[i-1]
            let point: CGPoint

            if i % buttonsPerRow == 0 {
                direction *= -1
                point = CGPointMake(previousPoint.x, previousPoint.y + verticalSpace)
            } else {
                point = CGPointMake(previousPoint.x + direction * horizontalSpace, previousPoint.y)
            }
            points.append(point)
        }

        // Make the buttons
        var containerWidth: CGFloat = 0
        var containerHeight: CGFloat = 0
        for (index, point) in points.enumerate() {
            let button = UIButton(frame: CGRectMake(point.x, point.y, 60, 60))
            button.setTitle("Button \(index)", forState: .Normal)
            button.setTitleColor(button.tintColor, forState: .Normal)
            button.layer.cornerRadius = 30
            button.layer.borderColor = UIColor .redColor().CGColor
            button.layer.borderWidth = 1


            buttonContainerView.addSubview(button)

            // Determine size needed in the container to show all button
            if button.frame.maxX > containerWidth {
                containerWidth = button.frame.maxX
            }
            if button.frame.maxY > containerHeight {
                containerHeight = button.frame.maxY
            }


          let myBezierPath = UIBezierPath()
            myBezierPath.moveToPoint(CGPointMake(point.x + 60, point.y + 30))
            myBezierPath.addLineToPoint(CGPointMake(point.x + 80, point.y + 30))

            let shapeLayer = CAShapeLayer()
            shapeLayer.path = myBezierPath .CGPath
            shapeLayer.strokeColor = UIColor.blueColor().CGColor
            shapeLayer.lineWidth = 2
            shapeLayer.fillColor = UIColor.clearColor().CGColor

           buttonContainerView.layer.addSublayer(shapeLayer)
        }

        // Optional: draw the alignment points and give the container view a background color
        // so it's easier to visualize
        for _ in points {

             for (index, point) in points.enumerate() {

            let circleLabel = UILabel(frame: CGRectMake(point.x, point.y, 11, 11))
            circleLabel.layer.cornerRadius = 5.5
            circleLabel.text = String(index + 1)
            circleLabel.textAlignment = NSTextAlignment.Center
            circleLabel.font = circleLabel.font.fontWithSize(8)

                  buttonContainerView.addSubview(circleLabel)
            }
        }
    //    buttonContainerView.backgroundColor = UIColor.lightGrayColor()


        // Center the containerView on the screen
        buttonContainerView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(buttonContainerView)

        let c1 = NSLayoutConstraint(item: buttonContainerView, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)
        let c2 = NSLayoutConstraint(item: buttonContainerView, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 0)
        let c3 = NSLayoutConstraint(item: buttonContainerView, attribute: .Width, relatedBy: .Equal , toItem: nil, attribute: .Width, multiplier: 0, constant: containerWidth)
        let c4 = NSLayoutConstraint(item: buttonContainerView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 0, constant: containerHeight)
        NSLayoutConstraint.activateConstraints([c1, c2, c3, c4])
    }


}

введите здесь описание изображения

25.03.2016

Ответы:


1

Вот идея: создайте сетку, которая будет служить точками выравнивания ваших кнопок. Добавьте все кнопки в представление контейнера, чтобы вы могли перемещать/центрировать их все одновременно.

func drawButtons() {
    let containerView = UIView()
    let buttonCount = 12
    let buttonsPerRow = 3
    let horizontalSpace: CGFloat = 100
    let verticalSpace: CGFloat = 50

    // Create the alignment points
    var points = [CGPointZero]
    var direction: CGFloat =  1

    for i in 1..<buttonCount {
        let previousPoint = points[i-1]
        let point: CGPoint

        if i % buttonsPerRow == 0 {
            direction *= -1
            point = CGPointMake(previousPoint.x, previousPoint.y + verticalSpace)
        } else {
            point = CGPointMake(previousPoint.x + direction * horizontalSpace, previousPoint.y)
        }
        points.append(point)
    }

    // Make the buttons
    var containerWidth: CGFloat = 0
    var containerHeight: CGFloat = 0
    for (index, point) in points.enumerate() {
        let button = UIButton(frame: CGRectMake(point.x, point.y, 0, 0))
        button.setTitle("Button \(index)", forState: .Normal)
        button.setTitleColor(button.tintColor, forState: .Normal)
        button.sizeToFit()

        containerView.addSubview(button)

        // Determine size needed in the container to show all button
        if button.frame.maxX > containerWidth {
            containerWidth = button.frame.maxX
        }
        if button.frame.maxY > containerHeight {
            containerHeight = button.frame.maxY
        }
    }

    // Optional: draw the alignment points and give the container view a background color
    // so it's easier to visualize
    for point in points {
        let circleView = UIView(frame: CGRectMake(point.x, point.y, 5, 5))
        circleView.layer.cornerRadius = 2.5
        circleView.layer.opacity = 0.5
        circleView.backgroundColor = UIColor.redColor()
        containerView.addSubview(circleView)
    }
    containerView.backgroundColor = UIColor.lightGrayColor()


    // Center the containerView on the screen
    containerView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(containerView)

    let c1 = NSLayoutConstraint(item: containerView, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)
    let c2 = NSLayoutConstraint(item: containerView, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 0)
    let c3 = NSLayoutConstraint(item: containerView, attribute: .Width, relatedBy: .Equal , toItem: nil, attribute: .Width, multiplier: 0, constant: containerWidth)
    let c4 = NSLayoutConstraint(item: containerView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 0, constant: containerHeight)
    NSLayoutConstraint.activateConstraints([c1, c2, c3, c4])
}

Результат (красные точки и серое изображение были добавлены для облегчения визуализации):

введите здесь описание изображения

25.03.2016
  • Вы можете помочь с отредактированным вопросом? 29.03.2016
  • Пожалуйста, опубликуйте новый вопрос 30.03.2016
  • Только что сделал: вот ссылка: stackoverflow. ком/вопросы/36295373/ 30.03.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..