2016-06-26 28 views
10

Ich bin 3 Tage neu zu schnell, und ich versuche herauszufinden, wie ein Rechteck zu zeichnen. Ich bin zu neu in der Sprache, um die zu erweiternden Klassen und die Methoden zum Überschreiben zu kennen, und ich habe nach Beispielcode gesucht, aber nichts scheint zu funktionieren (was ich meiner Verwendung von swift 3 zuschreibe).Swift 3: Zeichnen eines Rechtecks ​​

Was ich versuche ist jetzt:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     let k = Draw(frame: CGRect(
      origin: CGPoint(x: 50, y: 50), 
      size: CGSize(width: 100, height: 100))) 

     k.draw(CGRect(
      origin: CGPoint(x: 50, y: 50), 
      size: CGSize(width: 100, height: 100))); 
    } 

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


} 
class Draw: UIView { 

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

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func draw(_ rect: CGRect) { 
     let h = rect.height 
     let w = rect.width 
     var color:UIColor = UIColor.yellow() 

     var drect = CGRect(x: (w * 0.25),y: (h * 0.25),width: (w * 0.5),height: (h * 0.5)) 
     var bpath:UIBezierPath = UIBezierPath(rect: drect) 

     color.set() 
     bpath.stroke() 

     print("it ran") 

     NSLog("drawRect has updated the view") 

    } 

} 

Und das nichts zu tun. Hilfe.

+0

Wenn Sie gerade erst anfangen, ist es nicht der richtige Ort, um allgemeine Fragen wie diese zu Stack Overflow zu stellen. Sie sollten ein gutes Buch oder eine Reihe von Online-Tutorials finden.Werfen Sie einen Blick auf [Gute Quellen zum Lernen von ObjC] (http://stackoverflow.com/q/1374660); Es enthält Referenzen für iOS, und das meiste Material wurde zu diesem Zeitpunkt für Swift aktualisiert. Viel Glück! –

+1

1. Niemals 'Draw' selbst nennen. 2. Rufen Sie einfach 'view.addSubview (k)' auf, um die Ansicht zu Ihrer Ansichtshierarchie hinzuzufügen, und das Betriebssystem wird 'draw'-Methode für Sie aufrufen, wenn es benötigt wird. – Rob

Antwort

11

Um die Ansicht zu sehen, müssen Sie eine erstellen und ihr Rahmen geben, damit sie weiß, wie groß sie ist.

Wenn Sie setzen Ihren Code in einen Spielplatz, und dann fügen Sie diese Zeile:

let d = Draw(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 

Sie werden in der Lage sein, auf der Schnellansicht klicken auf der rechten Seite, und dann werden Sie das sehen Aussicht.

Yellow square in a playground


Sie können auch die Ansicht als Subview view in Ihrem ViewController hinzufügen und dann werden Sie es auf dem iPhone sehen:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let k = Draw(frame: CGRect(
     origin: CGPoint(x: 50, y: 50), 
     size: CGSize(width: 100, height: 100))) 

    // Add the view to the view hierarchy so that it shows up on screen 
    self.view.addSubview(k) 
} 

Beachten Sie, dass Sie draw(_:) nie nennen direkt. Es wird für Sie von Cocoa Touch aufgerufen, um die Ansicht anzuzeigen.

Yellow square on iPhoneSE

7

Erstellen Sie eine Klasse, ich habe es in einem separaten Swift 3-Datei.

// 
// Plot_Demo.swift 
// 
// Storyboard is not good in creating self adapting UI 
// Plot_Demo creates the drawing programatically. 

import Foundation 
import UIKit 

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

    required public init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    public override func draw(_ frame: CGRect) { 
     let h = frame.height 
     let w = frame.width 
     let color:UIColor = UIColor.yellow 

     let drect = CGRect(x: (w * 0.25), y: (h * 0.25), width: (w * 0.5), height: (h * 0.5)) 
     let bpath:UIBezierPath = UIBezierPath(rect: drect) 

     color.set() 
     bpath.stroke() 

     print("it ran") 
     NSLog("drawRect has updated the view") 
    } 
} 

Beispiel für die Verwendung in einem UIViewController Objekt:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Instantiate a new Plot_Demo object (inherits and has all properties of UIView) 
    let k = Plot_Demo(frame: CGRect(x: 75, y: 75, width: 150, height: 150)) 

    // Put the rectangle in the canvas in this new object 
    k.draw(CGRect(x: 50, y: 50, width: 100, height: 100)) 

    // view: UIView was created earlier using StoryBoard 
    // Display the contents (our rectangle) by attaching it 
    self.view.addSubview(k) 
} 

Run in einem iPhone-Simulator und auf einem iPhone:

enter image description here

Gebrauchte XCode Version 8.0 (8A218a), Swift 3, Ziel iOS 10.0

+2

Aus 'draw (_ :)' Dokumentation: - Sie sollten diese Methode niemals selbst aufrufen. Um einen Teil Ihrer Ansicht für ungültig zu erklären und dadurch zu veranlassen, dass dieser Teil neu gezeichnet wird, rufen Sie stattdessen die Methode 'setNeedsDisplay()' oder 'setNeedsDisplay (_ :)' auf. – bshirley

0

Dies ist ein anderer Weg Rechteck,

Schritt 1 der Zeichnung: Erhalten Rechteck-Pfad für gegebene Punkte

(Anmerkung: arrPathPoints 4 in count sein muß Rechteck zeichnen),

func getPathPayer(arrPathPoints:[CGPoint]) throws -> CAShapeLayer { 
     enum PathError : Error{ 
      case moreThan2PointsNeeded 
     } 

     guard arrPathPoints.count > 2 else { 
      throw PathError.moreThan2PointsNeeded 
     } 

     let lineColor = UIColor.blue 
     let lineWidth: CGFloat = 2 
     let path = UIBezierPath() 
     let pathLayer = CAShapeLayer() 

     for (index,pathPoint) in arrPathPoints.enumerated() { 
      switch index { 
      //First point 
      case 0: 
       path.move(to: pathPoint) 

      //Last point 
      case arrPathPoints.count - 1: 
       path.addLine(to: pathPoint) 
       path.close() 

      //Middle Points 
      default: 
       path.addLine(to: pathPoint) 
      } 
     } 

     pathLayer.path = path.cgPath 
     pathLayer.strokeColor = lineColor.cgColor 
     pathLayer.lineWidth = lineWidth 
     pathLayer.fillColor = UIColor.clear.cgColor 

     return pathLayer 
    } 

Schritt 2: Verwendung, Anrufmethode wie folgt,

override func viewDidLoad() { 
     super.viewDidLoad() 

     do { 
      let rectangleLayer = try getPathPayer(arrPathPoints: [ 
       CGPoint(x: 110, y: 110), //Top-Left 
       CGPoint(x: 130, y: 110), //Top-Right 
       CGPoint(x: 130, y: 130), //Bottom-Right 
       CGPoint(x: 110, y: 130)]) //Bottom-Left 
      view.layer.addSublayer(rectangleLayer) 
     } catch { 
      debugPrint(error) 
     } 
    }