2016-11-14 2 views
0

Мой вопрос похож на следующее:Как включить отрицательные координаты в UIView Swift 3

Negative coordinates in UIView.frame

По умолчанию начало координат находится в левом верхнем углу для рисования в прошивкой с использованием UIKit; Зачем?

Мне нужно, чтобы источник находился в центре кадра; координаты, которые я хочу построить включают отрицательные числа

Я искал, и я не могу найти, как я могу построить свои точки данных в Swift 3 с использованием UIKit

вот что я в настоящее время:

import Foundation 
import UIKit 

@IBDesignable 
public class Contours: UIView { 

    public var gridColor: UIColor = UIColor.clear 
    public var gridSize: CGSize = CGSize(width: 100, height: 100) 
    public var gridView = UIView(frame: CGRect(origin: .zero, size: .zero)) 

    public var dataSize: CGSize = CGSize(width: 5, height: 5) 
    public var dataColor: UIColor = UIColor.blue 
    public var dataLineColor: UIColor = UIColor.red 
    public var dataBorderWidth: CGFloat = 1.0 
    public var dataView = UIView(frame: CGRect(origin: .zero, size: .zero)) 

    public var fade: CGFloat = 0.5 

    public var distances: [Int] = [2601, 2600, 33, 2608, 2601, 2594, 2625, 2633, 2637, 2651, 2656, 2666, 2683, 2690, 2705, 2712, 2712, 2739, 2752, 53, 1103, 1060, 1019, 980, 944, 911, 33, 851, 826, 801, 777, 757, 737, 718, 701, 683, 667, 654, 53, 486, 470, 457, 448, 440, 432, 424, 416, 409, 403, 396, 389, 383, 378, 372, 367, 362, 357, 353, 348, 344, 340, 336, 333, 329, 326, 323, 319, 317, 314, 311, 309, 307, 305, 303, 301, 299, 298, 297, 295, 294, 293, 292, 291, 290, 290, 290, 290, 291, 293, 295, 303, 386, 383, 53, 350, 53, 53, 53, 53, 53, 3, 364, 362, 360, 356, 358, 355, 353, 351, 350, 349, 347, 345, 53, 53, 53, 308, 3, 309, 309, 312, 313, 315, 316, 319, 321, 53, 329, 332, 335, 332, 53, 53, 53, 53, 53, 53, 53, 3, 53, 53, 53, 53, 53, 53, 670, 33, 706, 728, 750, 772, 799, 825, 856, 887, 925, 755, 749, 744, 739, 734, 730, 727, 722, 719, 716, 714, 634, 709, 706, 704, 703, 701, 699, 700, 695, 697, 697, 338, 696, 697, 696, 698, 698, 700, 702, 703, 705, 707, 710, 712, 714, 718, 53, 53, 53, 53, 53, 53, 53, 53, 3, 53, 53, 53, 53, 53, 53, 53, 53, 3, 53, 53, 53, 53, 53, 53, 53, 3412, 3397, 3384, 53, 3538, 3603, 53, 2426, 2412, 2363, 2330, 2288, 2262, 2214, 2190, 2162, 2130, 53, 53, 53, 2807, 2631, 2408, 2638, 2607, 2601, 2562, 2534, 2515, 2496, 2478, 2462, 2445, 53, 53, 53, 1751, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 3, 53, 53, 53, 53, 53, 2643, 2643, 53, 2660, 53, 2528, 2523, 2221, 1955, 1684, 1677, 1684, 1694, 1705, 1202, 1204, 1211, 1217, 1225, 1233, 1239, 1249, 1259, 1270, 1280, 1289, 1280, 1011, 991, 977, 968, 966, 964, 968, 975, 984, 1003, 2, 53, 1297, 53, 53, 33, 1321, 1299, 1274, 1254, 1233, 1232, 1264, 1293, 3802, 53, 53, 53, 53, 53, 53, 53, 3, 53, 2878, 2870, 2848, 2821, 2803, 2788, 2769, 2753, 2740, 2708, 2711, 2701, 2682, 2656, 2664, 2644, 2644, 2631, 2626, 2616, 2610, 2604, 2605, 2605, 2600, 2598, 2603] 

    public var distx: [Double] = [] 
    public var disty: [Double] = [] 
    public var scalex: [Double] = [] 
    public var scaley: [Double] = [] 

    override public init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    public required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    public override func draw(_ rect: CGRect) { 

     alpha = 1 
     layer.backgroundColor = gridColor.cgColor 
     clipsToBounds = false 

     for index in 0...356 { 
      let radians = Double(index) * M_PI/180.0 
      let x = Double(distances[index]) * cos(Double(radians)) 
      let y = Double(distances[index]) * sin(Double(radians)) 
      distx.append(x) 
      disty.append(y) 
     } 

     let xmin: Double = Double(distx.min()!) 
     let xmax: Double = Double(distx.max()!) 
     let ymin: Double = Double(disty.min()!) 
     let ymax: Double = Double(disty.max()!) 

     let scale = max(xmax - xmin, ymax - ymin) 

     var circles = [UIView]() 
     circles.reserveCapacity(360) 
     for _ in 0...356 { 
      circles.append(UIView(frame: CGRect(origin: .zero, size: .zero))) 
     } 

     print("width: \(bounds.width), height: \(bounds.height)") 

     for index in 0...356 { 
      let radians = Double(index) * M_PI/180.0 
      let x = (Double(distances[index]) * cos(Double(radians))/scale) * Double(325) 
      let y = (Double(distances[index]) * sin(Double(radians))/scale) * Double(325) 

      var aPath = UIBezierPath() 
      aPath.move(to: CGPoint(x: 0, y: 0)) 
      aPath.addLine(to: CGPoint(x: x, y: y)) 
      UIColor.cyan.set() 
      aPath.stroke() 
      aPath.fill() 
      aPath.close() 

      circles[index].alpha = 1 
      circles[index].frame = CGRect(origin: .zero, size: dataSize) 
      circles[index].center = CGPoint(x: x, y: -y) 
      circles[index].layer.backgroundColor = dataColor.cgColor 
      circles[index].layer.borderColor = dataLineColor.cgColor 
      circles[index].layer.borderWidth = dataBorderWidth 
      circles[index].layer.cornerRadius = circles[index].bounds.width/2 

      if let superview = circles[index].superview { 
       superview.bringSubview(toFront: circles[index]) 
      } else { 
       addSubview(circles[index]) 
      } 

      scalex.append(x) 
      scaley.append(y) 
     } 

     dataView.frame = CGRect(origin: .zero, size: dataSize) 
     dataView.center = CGPoint(x: bounds.width/2, y: bounds.height/2) 
     dataView.layer.backgroundColor = UIColor.cyan.cgColor 
    } 

    private func reset() { 
     UIView.animate(withDuration: 0.25) {() -> Void in 
      self.gridView.center = CGPoint(x: self.bounds.width/2, y: self.bounds.height/2) 
     } 
    } 

} 






class ViewController: UIViewController { 

    @IBOutlet private weak var joystickMove: Joystick! 
    @IBOutlet private weak var joystickRotate: Joystick! 
    @IBOutlet private weak var objectView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     createJoystick() 
     createContours() 

//  joystickMove.trackingHandler = { (joystickData) ->() in 
//   //print("joystickMove data: \(joystickData)") 
//    
//   let scale: CGFloat = 5.0 
//    
//   self.objectView.center.x += joystickData.velocity.x * scale 
//   self.objectView.center.y += joystickData.velocity.y * scale 
//  } 
//   
//  joystickRotate.trackingHandler = { (joystickData) ->() in 
//   //print("joystickRotate data: \(joystickData)") 
//    
//   self.objectView.transform = CGAffineTransform(rotationAngle: joystickData.angle) 
//  } 
    } 

    private func createJoystick() { 
     // 1. Initialize an instance of `Joystick` using the constructor: 
     let joystick = Joystick() 

     let width: CGFloat = 100 
     let hieght: CGFloat = 100 
     let x_center = CGFloat(UIScreen.main.bounds.width/2) - CGFloat(width/2) 
     let y_center = UIScreen.main.bounds.height - UIScreen.main.bounds.height/4 

     joystick.frame = CGRect(x: x_center, y: y_center, width: width, height: hieght) 
     joystick.backgroundColor = UIColor.clear 

     // 2. Customize the joystick. 
     joystick.substrateColor = UIColor.lightGray 
     joystick.substrateBorderColor = UIColor.gray 
     joystick.substrateBorderWidth = 1.0 
     joystick.stickSize = CGSize(width: 50, height: 50) 
     joystick.stickColor = UIColor.darkGray 
     joystick.stickBorderColor = UIColor.black 
     joystick.stickBorderWidth = 2.0 
     joystick.fade = 0.5 

     // 3. Setup the tracking handler to get velocity and angle data: 
//  joystick.trackingHandler = { (joystickData) ->() in 
//   self.objectView.center.x += joystickData.velocity.x 
//   self.objectView.center.y += joystickData.velocity.y 
//  } 

     // 4. Add the joystick to your view: 
     view.addSubview(joystick) 
    } 

    private func createContours() { 
     let contour = Contours(frame: CGRect(x: 90.0, y: 175.0, width: 250.0, height: 250.0)) 
     view.addSubview(contour) 
    } 

    @IBAction func resetButtonTapped(sender: AnyObject) { 
     UIView.animate(withDuration: 0.5) {() -> Void in 
      self.objectView.center = self.view.center 
//   self.objectView.transform = CGAffineTransformIdentity 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

заметить смещение моих кругов и линий:

enter image description here

он имел обыкновение быть так:

enter image description here

ответ

0

Самый простой способ сделать это с помощью CGAffineTransform.

Вот хороший блог объяснить им: http://iphonedevelopment.blogspot.ca/2008/10/demystifying-cgaffinetransform.html

Однако, похоже, все, что вам нужно, это перевод.

Так создать свой преобразования:

let t = CGAffineTransform(translationX: bounds.width/2, y: bounds.height/2) 

то каждая точка вы хотите на новый набор координат

let newPoint = oldPoint.applying(t) 

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

let chartTransform = CGAffineTransform(a: innerWidth/xMax, b: 0, c: 0, d: -innerHeight/yMax, tx: origin.x, ty: origin.y + innerHeight) 

А и D шкалы Х и Y соответственно. Поэтому я масштабирую свои значения x по отношению к ширине представления/max X, а y - к тому же. Но поскольку Y увеличивается по мере того, как вы опускаетесь, я сбрасывал масштаб с отрицательным результатом. Это положит положительную ось y в вертикальном направлении. Чтобы приспособиться к этому, я должен перевести каждое значение вниз по длине диаграммы. origin.x и origin.y - это лишь небольшие отступы, где я начал свои топоры.