import UIkit
class CoreGraphUIVie UIView{
override func touchesBegan(_touches:Set<UITouch>, with event
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>, wit
self.backgroundColor = UIColor.blue
print("Moved:\(touches)")
classViewController: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 side : Int?
var origin : cgpoint?
var linecolor : UIColor = UIColor.red
var fillcolor:ntcolor = UIColor.green
var lineWidth :CGFloat= 2
init(name : string,side : Int,origin : cgpoint) {
self.name = name
self.sides = sides
self.origin = origin
}
func sayHello(){
nrint("Shape (name!),sides\(sidesl), and originCord is (\origin!.x),\(origin!.y)")
}
}
5.2.2实例化Shape类
import UIKit
class Shape{
var name string?
var sides : Int?
var origin :CGPoint?
var lineColor :UIColor =UIColor. red
var fill Color :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()
}
}
5.2.3 重载UIView中的Draw函数
/ /
import UIKit
class Shape {
var name :String?
var sides :Int?
var origin :CGPoint?
var lineColor :UIColor =UIColor. red
var f illColor: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)
}
}
我们通过给Shape 类增加一个方法drawBezierPath(),实现画一个矩形的功能。
具体来讲,在Shape类中增加一个方法drawBezierPath()
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()
}
在CzfView这个类中,修改draw方法,增加一行:
s. drawBezierPath()
最后在ViewController的ViewDidLoad()中,清除背景色,不然会出现黑色背景,具体增加的代码如下:
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.线段类Line
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()
}
}
3.矩形类Rectangle
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 =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)
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.圆形类Circle
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()
}
}
5.多边形类Polygons
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()
}
}
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 :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 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()
path. lineWidth =lineWidth!
lineColor?. setStroke()
path. stroke()
}
}
5.4奏响乐队凯歌
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 f illColor: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 =lineWidth!
path?. lineCapStyle =. round
lineColor?. setStroke()
path?. stroke()
}
}
class Rectangle :Shape {
var size :CGSize?
var corner :CGFloat?iOS?开发基础教程(Swift版)
init(name:String, origin:CGPoint, size :CGSize, corner :CGFloat,soundFile:?String ="LA.m4a") {
super. init(name:name, origin:origin,soundFile:soundFile)
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!)")
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:?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", 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!)")
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: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!)
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, 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(){
print("Draw \( name!)")
path =UIBezierPath()
let i = 360/angel!
let xzAngle =CGFloat. pi*2/i
let ×× = ( 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()
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)
}
}