2017-01-17 3 views
0

Мой шестиугольник не отображается в центре изображения. Как это исправить? Вот мой код.Swift 3: Шестиугольник не показывает центр изображения View

func roundedPolygonPath(rect: CGRect, lineWidth: CGFloat, sides: NSInteger, cornerRadius: CGFloat, rotationOffset: CGFloat = 0) 
     -> UIBezierPath { 
     let path = UIBezierPath() 
     let theta: CGFloat = CGFloat(2.0 * M_PI)/CGFloat(sides) // How much to turn at every corner 
     // let offset: CGFloat = cornerRadius * tan(theta/2.0)  // Offset from which to start rounding corners 
     let width = min(rect.size.width, rect.size.height)  // Width of the square 

     let center = CGPoint(x: rect.origin.x + width + 10/2.0, y: rect.origin.y + width/2.0) 

     // Radius of the circle that encircles the polygon 
     // Notice that the radius is adjusted for the corners, that way the largest outer 
     // dimension of the resulting shape is always exactly the width - linewidth 
     let radius = (width - lineWidth + cornerRadius - (cos(theta) * cornerRadius))/2.0 

     // Start drawing at a point, which by default is at the right hand edge 
     // but can be offset 
     var angle = CGFloat(rotationOffset) 

     let corner = CGPoint(center.x + (radius - cornerRadius) * cos(angle), center.y + (radius - cornerRadius) * sin(angle)) 
     path.move(to: CGPoint(corner.x + cornerRadius * cos(angle + theta), corner.y + cornerRadius * sin(angle + theta))) 

     for _ in 0 ..< sides { 
      angle += theta 

      let corner = CGPoint(center.x + (radius - cornerRadius) * cos(angle), center.y + (radius - cornerRadius) * sin(angle)) 
      let tip = CGPoint(center.x + radius * cos(angle), center.y + radius * sin(angle)) 
      let start = CGPoint(corner.x + cornerRadius * cos(angle - theta), corner.y + cornerRadius * sin(angle - theta)) 
      let end = CGPoint(corner.x + cornerRadius * cos(angle + theta), corner.y + cornerRadius * sin(angle + theta)) 

      path.addLine(to: start) 
      path.addQuadCurve(to: end, controlPoint: tip) 
     } 

     path.close() 

     // Move the path to the correct origins 
     let bounds = path.bounds 
     let transform = CGAffineTransform(translationX: -bounds.origin.x + rect.origin.x + lineWidth/2.0, 
              y: -bounds.origin.y + rect.origin.y + lineWidth/2.0) 
     path.apply(transform) 

     return path 
} 

enter image description here

+0

правильная ширина и высота шестиугольника не равны; 'height = a; width = a * sqrt (3)/2; 'в вашем случае; поэтому вам нужно перевести точки на 'a * (1 - (sqrt (3)/2))/2' или что-то еще. – holex

+0

Можете ли вы предложить мне, что я делаю в своем коде? –

+0

вам необходимо применить смещение на каждой координате 'x', которая выравнивает ваш шестиугольник в нужное место в вашем представлении. – holex

ответ

0

Оба этих элементов имеет x и y равна 0. Попробуйте использовать свойства width для вычисления преобразования.

+0

Можете ли вы предложить мне изменить мой код. –

+0

@MianShahbazAkram, я уже сказал вам, что делать, измените 'let transform = CGAffineTransform ...', чтобы использовать' width' и 'height' вместо x и y. – Preetygeek

Смежные вопросы