5.1.2
import UIKit
class CoreGraphUIView : UIView{
override func touchesBegan(_touches:Set<UITouch>, with event: UIEvent?) {
self.backgroundColor= UIColor.red
print("Began:\(touches)")
}
override func touchesEnded(_touches:Set<UITouch>,with event: UIEvent?) {
self.backgroundColor = UIColor.lightGray
print("Ended:\(touches)")
}
override func touchesMoved(_touches: Set<UITouch>,with event: UIEvent?) {
self.backgroundColor = UIColor.blue
print("Moved:\(touches)")
}
}
class ViewController : UIViewControlle {
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)
}
}
let touch:UITouch = touches.first! as UITouch
print(touch.location(in: view).x)
print(touch.location(in: view).y)
5.2
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 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) ")
}
}
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(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 : CGFloat = 2
init(name : String, sides : Int, origin : CGPoint) {
self. name = name
self. sides = sides
self. origin = origin
}
func sayHello() {
print("Shape:\(name!), sides \(sides!), origin (\(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", sides:0, origin: CGPoint(x: 0 ,y :0 ) )
let width = self. view. frame.size.width
let height = self. view. frame.size.height
let myView = CzfView(frame: CGRect(x: 0, y: 0, width: width, height: height))
myView. shape = myShape
self. view. addSubview(myView)
}
}
func drawBezierPath() {
let path = UIBezierPath()
let center : CGPoint = CGPoint(x: 100, y: 100)
let radius : CGFloat = 80
path. addArc(withCenter: center, radius: radius, startAngle: 0, endAngle: CGFloat. pi*2, clockwise:true)
path.lineWidth = 5
UIColor. red. setStroke()
path.stroke()
}
s.drawBezierPath()
myView.backgroundColor = UIColor.clear
5.3
1
class Shape {
var name : String?
var origin : CGPoint?
var lineColor : UIColor? = UiColor.red
var fillColor : UIColor? = UiColor.green
var linewidth : CGFloat? = 5
init (name : String, origin : CGPoint) {
self.name = name
self.origin = origin
}
convenience init(origin : CGPoint) {
self.init(name: "Shape Bassclass", origin: origin)
}
func drawBezierPath() {
print("Draw \(name!)")
}
}
2
class Line : Shape {
var start : CGPoint?
var end : CGPoint?
init(name: String, origin: CGPoint, start : CGPOint, end : CGPoint) {
super.init(name: name, origin: origin)
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!)")
let path = UIBezierPath()
path.move(to: start!)
path.addLine(to: end!)
path.lineWidth = lineWidth!
path,lineCapStyle = .round
lineColor?.steStroke()
path.stroke()
}
}
3
class Rectangle : Shape {
var size : CGsize?
init(name: String, origin: CGPoint , siae : CGSize) {
super.init(name: name, origin: origin)
self.sise = size
}
convenience init(origin: CGPoint , sise : CGSize) {
self.init(name: "Rectangle", origin: origin, sise: slce)
}
override func drawBesierPath(){
print("Draw \(name!)")
let path = UIBezierPath(rect: CGRect(origin: origin!, size: size!))
path.lineWidth = lineWidth!
lineColor?.setStroke()
path.stroke()
}
}
class Rectangle : Shape
// 左上角采用基类 Shape中的属性origin
// 宽度和高度,一般可以采用CGSize
var size : CGSize?
// 圆角的大小
var corner :CGFloat?
// 构造器
init (name: String, origin: CGPoint , size : CGSize ,corner : CGFloat) {
super.init(name: name, origin: origin)
self.size = size
self.corner = corner
}
convenience init(origin: CGPoint , size :CGSize, corner :CGFloat = 0) {
self.init(name: "Rectangle", origin: origin, size: size, corner :corner)
}
override func drawBezierPath(){
print("Draw \(name!)")
let path = UIBezierPath (roundedRect: CGRect(origin: origin!, size:
Size!), cornerRadius: corner!)
path.lineWidth = lineWidth!
lineColor?.setStroke()
path.stroke()
}
let myRect = Rectangle(origin: start, size: CGSize(width: 150, height:
100),corner: 8.0)
let myRect = Rectangle(origin: start, size: CGSize(width: 150, height:100))
4
class Circle : Shape {
var center : CGPoint?
var raduis : CGFloat?
var size : CGSize?
init(name: String, origin: CGPoint, center : CGPoint, raduis : CGFloat,size :CGSize) {
super.init(name: name, origin: origin)
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
b self.init(name: "Circle", origin: CGPoint(x:x,y:y), center: center,
raduis: raduis, size: CGSize(width: raduis, height: raduis))
}
convenience init(center :CGPoint, size :CGSize){
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!)")
let path = UIBezierPath(ovalin: CGRect(origin: originl!, size:size!))
path.linewidth = linexidth!
lineColor?.setStroke()
path.stroke()
}
}
5
class Polygons : Shape {
var points : Array<CGPoint>?
init(name: String, origin: CGPoint, points : Array<CGPoint> ) {
super.init(name: name, origin: origin)
self.points = points
}
convenience init (points : Array<CGPoint>) {
if points.count == 3 {
self.init(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
}
let path = UIBezierPath()
path.move(to: origin!)
for each in points! {
path.addLine(to: each)
}
path.close()
path.linewidth = linewidth!
lineColor?.setStroke()
path.stroke()
path.611()
}
}
5.3.2
class Fivestar : Shape {
var center : CGPoint?
var radius : CGFloat?
var angel : CGFloat?
init(name: string, origin: CGPoint, center : CGPoint, radius : CGFloat,angel : CGFloat ) {
super.init (name: name, origin: origin)
self.center = center
self.radius = radius
self.angel = angel
}
convenience init(center : CGPoint, radius: CFloat, 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 () {
let path = UIBezierPath()
let i = 360 /angel!
let xzAngle = CGFloat.pi*2/i
let xzX = (center?.x)!- sin(xzAngle)*radius!
let xzY = (center?.y)! - cos(xzAngle)*radius!
let pl = CGPoint (x: xzX,y: xzY)
path.move(to: p1)
let angle = CGFloat.pi*4/5
for i in 1...5 {
let x = (center?.x)! - sin(CGFloat (i)*angle+xzAngle)*radius!
let y = (center?.y)!- cos(CGFloat (i)*angle+xzAngle)*radius!
path.addLine (to: CGPoint (x: x, y: y) )
}
path.close ()
path.lineWidth = lineWidth!
linecolor?.setstroke()
path. stroke ()
}
}
init (name: String, origin: CGPoint, center: CGPoint, radius : CGFloat, angel
CGFloat, soundFile: String = "SO.m4a") {
super. init (name: name, origin: origin, soundFile: soundFile)
self.center = center
self .radius = radius
self.angel = angel
}
5.4.4
import uIkit
import Foundation
import AVFoundation
class Shape {
var name : String?
var soundPlayer : AVAudioPlayer?
var soundFile :String?
var path : UIBezierPath?
var selectedFlag : 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.mainpath(forResource: soundfile,ofType:nil) let url=URL(fileURWithPath:path!)
soundPlayer =try? AVAudioPlayer(contentsof: 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.startmstart
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?.setStroke()
path?.stroke()
}
}
class Rectangle : Shape{
var size : CGSize?
var corner : CGFloat?
init(name:String,origin: CGPoint, size : CGSire, Corner : 0GFloat,soundFile :
String = "LA.mda") {
super.init(name:Name,rigingin,soundFile:soundFile)
self.sizewsize
self.corner = corner
}
convenience init(origin: CGPoint,size :CGSize, corner : CGFloat - 0) {
self.init(name:“Rectangle“,origin:origin,size: size,corner :corner)
}
override func drawBezierPath(){
print("Draw \(name!)"){
path = UIBezierPath(roundedRect:CGRect(origin: originl, size
size!),cornerRadius: corner!)
if selectedFlag {
let dashes:[CGFloat] = [1,3]
path?.setLineDash(dashes,count:dashes.count, phase:0)
}
path?.lineWidth = lineWidth!
lineColor?.setstroke()
path?.stroke()
}
}
class Circle : Shape {
var center : CGPoint?
var raduis :CGFloat?
var size : CGSize?
init(name:String,origin:CGPoint,center:CGPoint, raduis :CGFloat,size :
CGSize,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“,origini CGPoint(xiXry:y), center: center,
raduis: raduis, Bize: CGSize(width; raduis, height; raduia))
}
convenience init(center : CGPoint, size : CGSize)(
let x = center.x - size.width/2
let y = center.y - size.height/2
self.init(name: "Oval/Ellipse",origin: CGPoint(xix,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?.setStroke()
path?.stroke()
}
}
class Polygons :Shape {
var points : Array<cgpoint>?
init(name:String,origin:CGPoint,oints: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.init(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 fune drawBezierPath(){
print("Draw \(name!)")
if(name == "Error") {
return
}
path = UIBezierPath()
path?.move(to: origin!)
for each in points! {
path?.addLine(to: each
}
path?.close()
path?.lineWidth = lineWidth!
lineColor?.setStroke()
path?.stroke()
path?.fill()
}
}
class FiveStar :Shape {
var center : CGPoint?
var radius : CGFloat?
var angel : CGFloat?
init(name: String,origin: CGPoint,center:CGPoint,radius :CGFloat,angel :
CGFloat,soundFile :String="so.m4a") {
super.init(name: name, origin: origin,soundFile: soundFile)
self.center= center
self.radius = radius
self.angel = angel
}
convenience init(center: CGPoint, radiun i carlont,angel : CGrloat
= 0) {
let x = center.x - radius
let y = center.y - radius
selfinit(name:"FiveStar",origintCGPoint(uik,yiy), center: contei
radius: radius, angel: angel)
}
override func drawBezierPath(){
print("Draw\(name!)")
path = UIBezierPath()
let i= 360/angel!
let xzAngle= CGFloat.pi*2/i
let xzX = (center?.x)! - sin(xzAngle)*radius!
let xzY = (center?.y)! - cos(xzAngle)*radius!
let p1 = CGPoint(x: xzX, y; xzY)
path?.move(to: pl)
let angle = CGFloat.pi*4/5
for i in 1...5 {
let x = (center?.x)! - sin(CGFloat(i)*angle+xzAngle)*radius!
let y = (center?.y)! - cos(CGFloat(i)*angle+xzAngle)*radius!
path?.addLine(to: CGPoint(x: x,y:y))
}
path?.close()
if selectedFlag{
let dashes:[CGFloat] = [1,3]
path?.setLineDash(dashes,count: dashes.count, phase:0)
}
path?.lineWidth = lineWidth!
lineColor?.setStroke()
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()
nib.
let starCenter = CGPoint(x: 180, y:180)
let star = FiveStar(center: starCenter,radius: 50, angel: 45
star.lineColor = UIColor.blue
let ovalCenter = CGPoint(x:100, y;300)
let ovalSize = CGSize(width: 100,height:60)
let ovalmCircle(center: ovalCenter, size: ovalSize)
let rectOrigin = CGPoint(x:60,y:50)
letrectSize = GSize(width: 100,height:50)
Let rect = Rectangle(origin:rectorigin,size:rectSize,corner:6)
rect.lineColor = UIColorgray
let myView = CzfView(frame:CGRect(x:0,y:0,width: self.view.
frame.size width, height: self.viewframe.size.height))
myView.backgroundColor = UIColor.clear
myView.add(shape: star)
myView.add(shape:oval)
myView.add(shape:rect)
self.view.addSubview(myView)
}
}