Connecter les UIButtons en traçant une ligne

J'ai besoin de connecter ces buttons avec une ligne mais j'ai des problèmes comme vous pouvez le voir sur la capture d'écran. J'ai besoin de la dernière ligne pour aller vertical (cercles verts). Aucune suggestion?

voici le code:

@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 = Ssortingng(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, atsortingbute: .CenterX, relatedBy: .Equal, toItem: self.view, atsortingbute: .CenterX, multiplier: 1, constant: 0) let c2 = NSLayoutConstraint(item: buttonContainerView, atsortingbute: .CenterY, relatedBy: .Equal, toItem: self.view, atsortingbute: .CenterY, multiplier: 1, constant: 0) let c3 = NSLayoutConstraint(item: buttonContainerView, atsortingbute: .Width, relatedBy: .Equal , toItem: nil, atsortingbute: .Width, multiplier: 0, constant: containerWidth) let c4 = NSLayoutConstraint(item: buttonContainerView, atsortingbute: .Height, relatedBy: .Equal, toItem: nil, atsortingbute: .Height, multiplier: 0, constant: containerHeight) NSLayoutConstraint.activateConstraints([c1, c2, c3, c4]) } } 

entrez la description de l'image ici

J'ai également essayé ceci qui semble fonctionner maintenant, mais je suis ouvert aux suggestions

  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) let lineView = UIView (frame: CGRectMake(previousPoint.x + 30, previousPoint.y + lineVerticalSpace, 1, 20)) lineView.layer.borderColor = UIColor .blueColor().CGColor lineView.layer.borderWidth = 3 buttonContainerView.addSubview(lineView) } else { point = CGPointMake(previousPoint.x + direction * horizontalSpace, previousPoint.y) } points.append(point) // print(direction) if direction == -1 { let lineView = UIView (frame: CGRectMake(previousPoint.x + (direction * lineHorizontalSpace + 40), point.y + 30, 20, 1)) lineView.layer.borderColor = UIColor .redColor().CGColor lineView.layer.borderWidth = 3 buttonContainerView.addSubview(lineView) } else { let lineView = UIView (frame: CGRectMake(previousPoint.x + direction * lineHorizontalSpace, point.y + 30, 20, 1)) lineView.layer.borderColor = UIColor .redColor().CGColor lineView.layer.borderWidth = 3 buttonContainerView.addSubview(lineView) } } 

Ce qui résulte en ceci:

entrez la description de l'image ici