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()
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)
}
}
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(name : String, sides:Int,origin: CGPoint){
self.naem=name
self.sides=sides
self.origin=origin
}
func sayHello(){
print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
}
}
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(name : String, sides:Int,origin: CGPoint){
self.naem=name
self.sides=sides
self.origin=origin
}
func sayHello(){
print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
}
}
class ViewController: UIViewController{
override func viewDidLoad(){
super.viewDidLoad()
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(name : String, sides:Int,origin: CGPoint){
self.naem=name
self.sides=sides
self.origin=origin
}
func sayHello(){
print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
}
}
class CzfView: UIView{
var shape : Shape?
override func draw(_rect: CGRect){
guard let s =shape else{
return
}
s.sayHello()
}
}
class ViewController: UIViewController{
override func viewDidLoad(){
super.viewDidLoad()
let myShape =Shape(name:"BaseShape",)
}
}
5.4.4
Copyright 2020年 Zhifeng 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()
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)
}
}