编辑代码

//第五章代码
//5.1

//
import UIKit

class CoreGraphUIView : UIView{
     override func touchesBegan(_touches:Set<UITouch>, with event: UIEvent?){
         self.backgroundColor= UIColor.red
         print("Brgan:\(touches)")
     }
      override func touchesEnded(_touches:Set<UITouch>,with event: UIEvent?){
          self.backgroundColor= UIColor.red
          print("Began:\(touches)")
      }

      override func touchesMoved(_touches: Set<UITouch>,with event: UIEvent?){
          self.backgroundColor = UIColor.lightGray
          print("Ended:\(touches)")
      }
}

class ViewController:UIViewController{

    override func viewDidLoad(){
        super.viewDidLoad()
       // Do any additional aetup after loading the view.
       let height = self.view.frame.size.height
       let width= self.view.frame.size.width
       let graphFrame =CGRect(x:0,y:0,width: width,height: height)
       let grapView =  CoreGraphUIView(frame: graphFrame)
       graphView.backgroundColor =UIColor.white
       self.view.addSubview(graphView)
    }
}



//5.2.1
class Shape{
    //名称
    var name  :  String?
    //边数
    var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}


//5.2.2
//
import UIKit

class Shape{
    //名称
    var name :  String?
    //边数
     var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class  ViewController: UIViewController{
    override func viewDidLoad(){
        super.viewDidLoad()
        //Do any additional setup after loading the view.
        //此处调用Shape类,建立一个对象(实例)myShaple
        let myShape =Shape(name:"BaseShape",sides:0, origin: CGPoint(x: 0,y:0))
        myShape.sayHello()
    }
}


5.2.3
import UIKit

class Shape{
    //名称
    var name: String?
    //边数
       var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class CzfView: UIView{
    //成员变量(属性)shape,其类型为Shape
    var shape : Shape?
    //重载UIView的draw方法
    override func draw(_rect: CGRect){
        //判断shape变量是否为空值nil
        guard let s =shape else{
            return
        }
        //不为空,则调用shape这个实力方法
        s.sayHello()
    }
}

class ViewController: UIViewController{
     
     override func viewDidLoad(){
         super.viewDidLoad()
         //Do any additional step after loading the view, typically  from a nib.
         //此处建立了一个CzfView的实例myShape
         let myShape =Shape(name:"BaseShape",)
     }
}


5.4.4
//
//ViewController.swift
//GeometryBand
//
//Created by Zhifeng Chen on 2020/8/4.
//
Copyright 2020Zhifeng Chen. All rights reserved.
//

import UIKit
import Foundation
import AVFoundation

class Shape {
    var name : String?
    var soundPlayer : AVAudioPlayer?
    var soundFile : String?
    var path : UIBezierPath?
    var selectedFlay : Bool =false
    var origin : CGPoint?
    var lineColor : UIColor? = UIColor.red
    var fillColor : UIColor? = UIColor.green
    var lineWidth : CGFloat? =5
    init (name :String, origin :CGPoint,soundFile: String="DO.m4a"){
        self.name=name
        self.origin=origin
        self.soundFile=soundFile
    }
    convenience init(origin : CGPoint){
        self.init(name :"Shape Bassclass", origin : origin)
    }
    func drawBezierPath(){
        print("Draw \(name!)")
    }
    func playAudio(){
        print("Play sound:\(soundFile!)")
        let path = Bundle.main.path(forResource: soundFile, ofType: nil)
        let url =URL(fileURLWithPath: path!)
        soundPlayer =try? AVAudioPlayer(conventsOf: url)
        soundPlayer?.play()
    }
    func isSelected(point : CGPoint) -> Bool{
        if (path?. contains(point))!{
            selectedFlag =true
            return true
        }
        else{
            selectedFlag = false
            return false
        }
    }
}

class Line : Shape{
    var start : CGPoint?
    var end : CGPoint?
    init(name: String, origin : CGPoint, start: CGPoint,end: CGPoint,soundFile: String ="FA.m4a"){
        super.init(name: name, origin: origin, soundFile:soundFile)
        self.start=start
        self.end=end
    }
    convenience init(start : CGPoint, end :CGPoint){
        self.init(name:"Line",origin: start,start:start,end:end)
    }
    override func drawBezierPath(){
        print("Draw\(name!)")
        path = UIBezierPath()
        path?.move(to:start!)
        path?.addLine(to:end!)
        path?.lineWidth=lineWidth!
        path?.lineCapStyle= .round
        lineColor?.setSteoke()
        path?.stroke()
    }
}
class Rectangle: Shape{
    var size: CGSzie?
    var corner : CGFloat?
    init(name: String,origin : CGPoint,size :CGSzie,corner :CGFloat,soundFile:String="la.m4a"){
        super.init(name:name,origin:origin,soundFile: soundFile)
        self.size=size
        self.corner =corner
    }
    convenience init(name: "Rectangle",origin:origin,size: size, corner: corner)
}
override func drawBezierPath(){
    print("Draw\(name!)")
    path=UIBezierPath(roundedRect: CGRect(origin: origin!,size:size!), cornerRadius: corner!)
    if selectedFlag{
        let dashes :[CGFloat] =lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
    }
}
class Circle : Shape{
    var center : CGPoint?
    var raduis :CGFloat?
    var size: CGSzie?
    init(name:String,origin : CGPoint,center: CGPoint, raduis :CGFloat, size:CGSzie,soundFile: String="MI.m4a"){
        super.init(name:name,origin:origin,soundFile:soundFile)
        self.center=center
        self.raduis=raduis
        self.size=size
    }
    convenience init(center: CGPoint,raduis :CGFloat){
        let x=center.x-raduis
        let y=center.y-raduis
        self.init(name:"Circle",origin:CGPoint(x:x,y:y),center:center,raduis:raduis,size:CGSzie(width:raduis,height:raduis))
    }
    convenience init(center: CGPoint,size: CGSzie){
        let x=center.x-size.width/2
        let y= center.y-size.height/2
        self.init(name:"Oval/Ellipse", origin: CGPoint(x:x,y:y),center:center, raduis:0,size:size)
    }
    override func drawBezierPath(){
        print("Draw\(name!)")
        path= UIBezierPath(OvalIn:CGRect(origin:origin!, size:size!))
        if selectedFlag{
            let dashes: [CGFloat]=[1,3]
            path?.setLineDash(dashes,count: dashes.count,phase:0)
        }
        path?.lineWidth=lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
            }
}

class Polygons : Shape{
    var points: Array<CGPoint>?
    init(name:String,origin:CGPoint,soundFile:soundFile:soundFile)
    self.points=points
}                     
convenience init(points :Array<CGPoint>){
    if points.count ==3{
        self.init(name: "Polygons", origin:points.first!, points:points)
    }
    else if points.count >=3{
        self.init(name:"Polygons", origin: points.first!, points:points)
    }
    else{
        let origin = CGPoint(x:0,y:0)
        self.init(name:"Error", origin:origin,points:points)
    }
}
override func drawBezierPath(){
    print("Draw \(name!)")
    if(name=="Error"){
        return
    }
    path= UIBezierPath()
    path?.move(to:each)
}                            
path?.close()
path?.lineWidth= lineWidth!
lineColor?.setSteoke()
path?.fill()
}
}
class FiveStar : Shape{
    var center : CGPoint?
    var raduis : CGFloat?
    var angle :CGFloat?
    init(name: String,origin:CGPoint,center : CGPoint,raduis :CGFloat,angel :
    CGFloat,soundFile:String="SO.m4a"){
        super.init(name:name,origin:origin,soundFile:soundFile)
        self.center=center
        self.raduis=raduis
        self.angel=angel
    }
    convenience init(center : CGPoint, raduis :CGFloat,angel:CGFloat=0){
        let x=center.x-raduis
        let y=center.y-raduis
        self.init(name:"FiveStar", origin:CGPoint(x:x,y:y),center:center,raduis:raduis,angel:angel)
    }
    override func drawBezierPath(){
        print("Draw \(name!)")
        path=UIBezierPath(OvalIn: CGRect(origin: origin!, size: size!))
        if selectedFlag{
            let dashes: [CGFloat] = [1,3]
        path?.setLineDash(dashes, count: dashes.count, phase: 0)
        path?.lineWidth = lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
    }
}                     

class Polygons : Shape{
    var points : Array<CGPoint>?
    init(name: String, origin: CGPoint,points: Array<CGPoint>,soundFile: String="RE.m4a"){
        super.init(name: name, origin: origin,soundFile: soundFile)
        self.points= points
    }
convenience init(points : Array<CGPoint> ) {
    if points.count ==3{
        self.inti(name: "Triangel", origin :points.first!, points:points)
    }
    else if points.count >=3{
        self.init(name: "Polygons", origin: points.first!, points:points)
    }
    else{
        let origin= CGPoint(x: 0, y:0)
        self.init(name: "Error", origin: origin, points: points)
    }
    }
    override func drawBezierPath(){
        print("Draw \(name!)")
        if(name =="Error"){
            return
        }
        path = UIBezierPath()
        path?.move)(to : origin!)
        forResource each in points! {
            path?.addLine(to :each)
        }
        path?.close()
        path?.lineWidth = lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
        path?.fill()
    }
}
    class FiveStar : Shape{
        var center : CGPoint?
        var raduis :CGFloat?
        var angel : CGFloat?
        init(name: String, origin: CGPoint,center : CGPoint,raduis : CGFloat,angel: CGFloat,soundFile: String=" SO.m4a"){
            super.init(name: name,origin: origin,soundFile :soundFile)
            self.center= center
            self.raduis= raduis
            self.angel= angel
        }
        convenience init(center:CGPoint, raduis:CGFloat,angel: CGFloat=0){
            let x=center.x-radius
            let y=center.y-radius
            self.init(name:"FiveStar", origin: CGPoint(x:x,y:y), center: center,radius: radius,angel: angel)
        }
        override func drawBezierPath(){
            print("Draw \(name!)")
            path = UIBezierPath()
            let i =360/angel!
            let xzAngel=CGFloat.PI*2/i
            let xzX=(center?.x)! -sin(xzAngel)*radius!
            let xzY=(center?.y)! -cos(xzAngel)*radius!
            let pl =CGPoint(X: xzX,y: xzY)
            path?.move(to:pl)
            let angel= CGFloat.pi*4/5
            for i in 1...5{
                let x=(center?.x)! - sin(CGFloat(i)*angel+xzAngel)*radius!
                let y=(center?.y)! - cos(CGFloat(i)*angel+xzAngel)*radius!
                path?.close()
                if selectedFlag{
                    let dashes:[CGFloat] = [1,3]
                    path?.setLineDash(dashes, count: dashes.count,phase: 0)
                }
                path?.lineWidth=lineWidth!
                lineColor?.setSteoke()
                path?.stroke()
            }
        }
        class CzfView : UIView{
            private var shapes : Array<Shape>=[]
            override func draw(_rect: CGRect){
                for s in shapes{
                    s.drawBezierPath()
                }
            }
            func add(shape :shape){
                shapes.append(shape)
            }
            override func touchesBegan(_touches: Set<UITouch>, with event: UIEvent?){
                let touch:UITouch=touches.first! as UITouch
                let point = touch.location(in: self)
                for s in shapes{
                    if s.isSelected(point:point){
                        s.playAudio()
                        self.setNeedsDisplay()
                    }
                }
            }
        }
        class ViewController: UIViewController{
            override func viewDidLoad(){
                super.viewDidLoad()
                //Do any additional setup after loaing the view,typically from anib.
                let starCebter = CGPoint(x: 180,y: 180)
                let star =FiveStar(center: staCenter,radius: 50,angel: 45)
                star.lineColor =UIColor.Bundle
                let OvalCenter =CGPoint(x:100,y:300)
                let ovalSize= CGSzie(width:100,height:60)
                let oval =Circle(center:ovalCenter,size: ovalSize)
                let rectOrigin =CGPoint(x: 60,y: 50)
                let rectSize=CGSzie(width   : 100,height: 50)
                let RECT =Rectangle(origin: rectOrigin, size: rectSize,corner:6)
                 rect.lineColor = UIColor.lightGray
                 let myView= CzfView(frame: CGRect(x:0,y:0, width: self.view.frame.size.width, height: self.view.frame.size.height))
                 myView.backgroundColor=UIColor.clear
                 myView.add(shape: star)
                 myView.add(shape: oval)
                 myView.add(shape: rect)
                 self.view.addSubview(myView)
            }
}