ViewController.swift
GraphDemo
Created gy Li Tao on 2022/01/42.
Copyright © 2022 Li Tao.All right reserved
import UIKit
class CoreGraphUIView : UIView {
override func touchesBegan(_touches:Set<UITouch>, with event: UIEvent?){
self.backgroundColor = UIColor.red
print("Begin:\(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: 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 graphView = 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)
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 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 : CGFloat = 2
init(name : String, sides : Int, origin : CGPoint) {
self.name = 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()
}
}
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 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", 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
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!)")
}
}
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?.setStroke()
path.stroke()
}
}
class Rectangle :Shape {
var size :CGsize?
init(name: String, origin: CGPoint ,size : CGSize){
super.init(name: name, origin: origin)
self.size = size
}
convenience init(origin: CGPoint , size : CGSize) {
self.init(name: "Rectangle", origin: origin, size: size)
}
override func drawBezierPath(){
print ("Draw \(name!)")
let path = UIBezierPath(rect: CGRect(origin: origin!,size: size!)
path.linewidth m linewidth!
lineColor?.setStroke()
path.stroke()
}
}
class Rectangle : Shape {
var size : cgsize?
var corner : cgfloat?
init(name: String, origin: CGPoint , size :CGSize , corner :CGFloat) {
super.init(name: name, origin: origin) seli.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!
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))
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
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: origin!, size:size!))
path.linewidth = lineWidth!
lineColor?.setstroke()
path.stroke()
}
}
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.fill()
}
}
五角星的绘制
class FiveStar : Shape (
//五角星和正五边形较为类似
// 中心坐标
var center : cGPoint?
//半径
var radius : cgFloat?
//旋转的角度
var angel : cfloat?
//构造器
hit(name: String, origin: CGPoint,center : CGPoint, radius : CGFloat,ange
:CGFloat ){
super.init(name: name, origin: origin)
self.center = center
self.radius = radius
self.angel = angel
}
convenience init(center : CGPoint, radius : 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(){
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()
}
import uikit
import Foundation
import AVFoundation
class Shape {
var name : String?
var soundPlayer : AVAudioplayer?
var soundfile : string?
var path : UIBezierPath?
ar 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.main.path(forResource: soundfile, ofType: nil) let url = URL(fileURLWithPath: 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.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 m lineWidth!
path?.lineCapStyle =.round
lineColor?.setstroke()
path?.stroke()
}
}
class Rectangle : Shape {
var size : cgsize?
var corner : cgfloat?
init(name: String, origin: CGPoint, size : GSize, corner : CGFloat,soundrile :String - "LA.m4a") {
super.init(name: name, origin: origin,noundfileisoundfile)
self.sire -size
self.corner - corner
}
convenience init(origin: capoint, size : cGSize, corner : CGFloat - 0) {
self.init(name: "Pectangle", 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]=[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 :GSize, soundFile :String - "MI.m4a") {
super,init(name: name, origin: origin,soundfile:soundfile)
self.centers center
self.raduis m 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: CGSize(width: raduis, height: raduis))
}
convenience init(center : CGPoint, size : CGSize)(
let xm center.x- size.width/2
let y-center.y- size.height/2
self.init (name:"Oval/Ellipse", origin: CGPoint(xix,y:y), centertcenter, 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, 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.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; o, y: 0)
self.initiname:"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 : OGPoint, radius : CGFloat,angel CGFloat,soundFile : String ="so.m4a") {
super.init(name: name, origin: origin,soundfile: soundFile)
self.centerm center
self.radius = radius
self.angel = angel
}
convenience init(center :CGPoint, radius : CGFloat,angel : CGFloat=0){
let x = center.x- radius
let ym 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 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: 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 fune touchesBegan! touchest 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 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 oval = Circle(center: ovalCenter, size: ovalsize)
let rectOrigin = CGPoint(x: 60, y: 50)
let rectsize = CGSize(width: 100, height: 50)
let rect = Rectangle(origin: rectorigin, size: rectsize, corner: 6)
rect.lineColor =UIColor.gray
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)
}
}