iOS 는 간단 한 핸드 드로잉 응용 인 스 턴 스 를 어떻게 개발 하 는 지 상세 하 게 설명 합 니 다.
수집 점,모양 그리 기,모양 착색,사용자 에 게 보 여주 면 끝 인 것 같 습 니 다.
프레임 은 Quartz2D 입 니 다.
1,수집 점
우선 인터페이스 UIView 가 필요 합 니 다.이 인터페이스 로 사용자 의 제스처 를 감청 하고 수집 점 이 필요 합 니 다.
var lastPoint = CGPoint.zero
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
return
}
// ...
lastPoint = touch.location(in: view)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// ...
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// ...
}
2.모양 을 그립 니 다.모양 에 착색 을 줍 니 다.그림 컨 텍스트 UIGraphics GetCurrent Context 를 엽 니 다.
채집 포인트 연결 사용 하기
사용자 가 손 으로 그린 것 은 연속 적 인 곡선 이 아니 라 여러 개의 선분 을 연결 한 것 이다.
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) {
UIGraphicsBeginImageContext(view.frame.size)
guard let context = UIGraphicsGetCurrentContext() else {
return
}
// ...
//
context.move(to: fromPoint)
context.addLine(to: toPoint)
context.setLineCap(.round)
context.setBlendMode(.normal)
context.setLineWidth(brushWidth)
context.setStrokeColor(color.cgColor)
context.strokePath()
// ...
UIGraphicsEndImageContext()
}
3.사용자 에 게 보 여주 기첫 번 째 로 사용 하 는 UIView 는 UIImageView 입 니 다.
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) {
UIGraphicsBeginImageContext(view.frame.size)
guard let context = UIGraphicsGetCurrentContext() else {
return
}
tempImageView.image?.draw(in: view.bounds)
// ...
tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
4,화필 설정붓 의 색깔 과 굵기 를 고치다
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) {
UIGraphicsBeginImageContext(view.frame.size)
guard let context = UIGraphicsGetCurrentContext() else {
return
}
// ...
context.setBlendMode(.normal)
//
context.setLineWidth(brushWidth)
//
context.setStrokeColor(color.cgColor)
// ...
}
붓 을 지우개 로 바꾸다그림 상하 문장의 혼 색 모드 를 바꾸다
지우개 가 됐어 요.
switch type {
case .pencil, .none:
context.setBlendMode(.color)
case .eraser:
context.setLineWidth(15)
context.setStrokeColor(UIColor.clear.cgColor)
context.setBlendMode(.clear)
}
5,후속더 많은 기능:
텍스트 입력 기능 추가,
텍스트 상자 컨트롤 이 필요 합 니 다 UITextField,UITextView
텍스트 상자 컨트롤 은 일반적으로 드래그 할 수 있 습 니 다.
텍스트 상 자 를 캔버스 위 에 놓 고 캔버스 를 끌 어 내 는 데 문제 가 있 습 니 다.
이 럴 때 경계 검 사 를 해 야 돼 요.
성능 최적화:
일반 성능 최적화,인쇄 함수 의 실행 시간
캔버스 의 크기 가 1366 X 7700(iPad Pro+UIScrollView)일 때 캔버스 가 매우 크다.
모두 한 번 그리 고 그림 을 꺼 내 면 성능 소모 가 많 습 니 다.
tempImageView.image?.draw(in: view.bounds)
// ...
tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
한 번 그리 기,약 0.07 초,
let t = Date()
self.drawingImage()
if #available(iOS 13.0, *) {
let span = t.distance(to: Date())
print(span)
}
우 리 는 60 의 FPS 를 기대 하 는데,각 프레임 의 계산 시간 은 0.016 이기 때문에,이 방법 을 자주 호출 하여,심하게 걸 렸 다.이전 방법 은 점 하나,점 하나 그리 기 입 니 다.
이동 해서 한 번 그립 니 다.
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
return
}
swiped = true
let currentPoint = touch.location(in: view)
drawLine(from: lastPoint, to: currentPoint)
lastPoint = currentPoint
}
한 단락 의 선 을 그 으 면 func touches Moved()는 보통 30~60 회 촉발 할 수 있 고 수집 한 점 이 비교적 많 으 며 선 이 부 드 럽 습 니 다.이 소모 성능 방법 을 자주 호출 합 니 다.
6 회 시전 가능,1 단 그리 기 6 개 점 만 채집 가능,정상 손 속도,다각형 하나만 그리 기
이렇게 최적화 할 수 있 습 니 다.점 의 수집 과 그리 기 분리.
타 이 머 를 사용 하여 0.15 초 간격 으로 한 번 씩 그립 니 다.
원래 수집 점 은 CGPoint 였 는데 지금 수집 점 은[CGPoint]입 니 다.
성능 을 소모 하 는 방법 은 적 게 호출 하면 된다.
tempImageView.image?.draw(in: view.bounds)
// ...
tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
앞의 4 시 코드,github 참조 후속 정리 필요,tbd
총결산
iOS 가 간단 한 핸드 드로잉 애플 리 케 이 션 을 어떻게 개발 하 는 지 에 관 한 글 은 여기까지 입 니 다.더 많은 iOS 개발 핸드 드로잉 애플 리 케 이 션 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.