2017-01-22 13 views
2

図面を内側にしてUIViewを回転させたい(円、矩形または線)。描画中にUIViewを回転させる際の問題

:私はビューを回転し、回転せずに...図面ビューに従っていません(私は、図面のいくつかのプロパティを変更したときに、私はつまり、IRを必要とする)描画

のUIViewを更新するときに問題があります回転に

UIView without rotation

のUIView:ここ

UIView rotated and drawing distortion

は私です簡単なコード(元のコードから少し抜粋):

メインのViewController

class TestRotation: UIViewController { 

// MARK: - Properties 

var drawingView:DrawingView? 

// MARK: - Actions 

@IBAction func actionSliderRotation(_ sender: UISlider) { 

    let degrees = sender.value 
    let radians = CGFloat(degrees * Float.pi/180) 
    drawingView?.transform = CGAffineTransform(rotationAngle: radians) 

    drawingView?.setNeedsDisplay() 
} 

// MARK: - Init 

override func viewDidLoad() { 
    super.viewDidLoad() 

    drawingView = DrawingView(frame:CGRect(x:50, y:50, width: 100, height:75)) 

    self.view.addSubview(drawingView!) 

    drawingView?.setNeedsDisplay() 
} 

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

} 

のUIView

class DrawingView: UIView { 

override func draw(_ rect: CGRect) { 

    let start = CGPoint(x: 0, y: 0) 
    let end = CGPoint(x: self.frame.size.width, y: self.frame.size.height) 

    drawCicrle(start: start, end: end) 
} 

func drawCicrle(start:CGPoint, end:CGPoint) { 

    //Contexto 
    let context = UIGraphicsGetCurrentContext() 

    if context != nil { 

     //Ancho 
     context!.setLineWidth(2) 

     //Color 
     context!.setStrokeColor(UIColor.black.cgColor) 
     context!.setFillColor(UIColor.orange.cgColor) 

     let rect = CGRect(origin: start, size: CGSize(width: end.x-start.x, height: end.y-start.y)) 

     let path = UIBezierPath(ovalIn: rect) 

     path.lineWidth = 2 
     path.fill() 
     path.stroke() 

    } 
} 

// MARK: - Init 

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

    self.backgroundColor = UIColor.gray 
} 

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

} 

私が回転した後、表示を更新していない場合、問題が一時的に解決されているようですしかし、他の理由(プロパティが変更された)のために後でリフレッシュする必要がある場合は、問題が再度表示されます。

どうすればよいですか?事前に感謝

答えて

3

boundsを使用する必要がある場合は、frameを使用しています。

frameは、viewを含む四角形です。 viewsuperviewの座標系で指定され、viewを回転すると、回転した正方形が回転しない正方形よりもX方向およびY方向にさらに広がるため、frameが変更されます。

boundsは、viewの内容を含む矩形です。これはviewの座標系で指定されており、viewが回転または移動されても変更されません。あなたはdraw(_:)機能にboundsframeを変更した場合は

、それはあなたが期待するように動作します:

override func draw(_ rect: CGRect) { 

    let start = CGPoint(x: 0, y: 0) 
    let end = CGPoint(x: self.bounds.size.width, y: self.bounds.size.height) 

    drawCicrle(start: start, end: end) 
} 

はここで、スライダーを移動すると再描画された楕円形を示すデモです。

class DrawingView: UIView { 

    var fillColor = UIColor.orange { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    override func draw(_ rect: CGRect) { 

     let start = CGPoint(x: 0, y: 0) 
     let end = CGPoint(x: self.bounds.size.width, y: self.bounds.size.height) 

     drawCircle(start: start, end: end) 
    } 

    func drawCircle(start:CGPoint, end:CGPoint) { 

     //Contexto 
     let context = UIGraphicsGetCurrentContext() 

     if context != nil { 

      //Ancho 
      context!.setLineWidth(2) 

      //Color 
      context!.setStrokeColor(UIColor.black.cgColor) 
      context!.setFillColor(fillColor.cgColor) 

      let rect = CGRect(origin: start, size: CGSize(width: end.x-start.x, height: end.y-start.y)) 

      let path = UIBezierPath(ovalIn: rect) 

      path.lineWidth = 2 
      path.fill() 
      path.stroke() 

     } 
    } 

    // MARK: - Init 

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

     self.backgroundColor = UIColor.gray 
    } 

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

} 

@IBAction func actionSliderRotation(_ sender: UISlider) { 

    let degrees = sender.value 
    let radians = CGFloat(degrees * Float.pi/180) 
    drawingView?.transform = CGAffineTransform(rotationAngle: radians) 

    drawingView?.fillColor = UIColor(hue: CGFloat(degrees)/360.0, saturation: 1.0, brightness: 1.0, alpha: 1.0) 

} 
+0

ありがとう:

Rotate Oval demo


はここで変更されたコードです!私はたくさんの戦いの後あなたの答えを見て、私はそれを見た前に私はrect対boundsについての問題を発見...;) –

関連する問題