2016-06-26 57 views
10

Jestem 3 dni nowy na szybki i próbuję dowiedzieć się, jak narysować prostokąt. Jestem zbyt nowy w tym języku, aby znać klasy, które można rozszerzyć, i metody, które należy zastąpić. Rozejrzałem się po przykładowym kodzie, ale nic nie działa (co przypisuję używaniu szybkiego 3).Swift 3: Rysowanie prostokąta

Próbuję teraz jest:

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") 

    } 

} 

I że nie robi nic. Wsparcie.

+0

Jeśli dopiero zaczynasz, zadawanie szerokich pytań w ten sposób w Stack Overflow nie jest tym, czym musisz być. Powinieneś znaleźć dobrą książkę lub serię samouczków online.Spójrz na [Dobre zasoby do nauki ObjC] (http://stackoverflow.com/q/1374660); Zawiera odniesienia do iOS, a większość materiałów zostanie zaktualizowana dla Swift w tym momencie. Powodzenia! –

+1

1. Nigdy nie wzywaj sam 'draw'. 2. Wystarczy wywołać 'view.addSubview (k)', aby dodać widok do hierarchii widoków, a system operacyjny wywoła metodę 'draw', gdy zajdzie taka potrzeba. – Rob

Odpowiedz

11

Aby zobaczyć widok, należy go utworzyć i nadać mu ramkę, aby wiedział, jak duży jest jego rozmiar.

Jeśli umieścisz kod na placu zabaw, a następnie dodać ten wiersz:

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

będziesz mógł kliknąć na Quick View po prawej stronie, a następnie będziesz zobaczyć widok.

Yellow square in a playground


Można również dodać widok jako podrzędny z view w ViewController i wtedy zobaczysz go na iPhone:

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) 
} 

Należy pamiętać, że nigdy nie zadzwonić draw(_:) bezpośrednio. Jest on wywoływany przez Cocoa Touch, aby wyświetlić widok.

Yellow square on iPhoneSE

7

Utwórz klasę, umieścić ją w osobnym pliku Swift 3.

// 
// 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") 
    } 
} 

Przykład zastosowania w obiekcie UIViewController:

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) 
} 

biegnie w symulatorze iPhone i iPhone:

enter image description here

używany XCode wersja 8.0 (8A218a) Swift 3, cel iOS 10.0

+2

Z dokumentacji 'draw (_ :)': - Nigdy nie powinieneś bezpośrednio wywoływać tej metody. Aby unieważnić część widoku, a tym samym spowodować odświeżenie części, należy zamiast tego wywołać metodę 'setNeedsDisplay()' lub 'setNeedsDisplay (_ :)'. – bshirley

0

To jest inny sposób rysunku Prostokąt

Etap 1. Pierwsze ścieżkę prostokąt na dane punktów

(Uwaga: arrPathPoints musi wynosić 4, w liczbie do opracowania prostokąt)

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 
    } 

Etap 2: Sposób użycia, Metoda połączenia taka jak ta,

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) 
     } 
    }