안녕하세요 Stack Overflow 커뮤니티,
Swift 3.0을 사용하여 Xcode 8.0에서 프로젝트를 진행하고 있습니다. 내가 개발하려는 애플리케이션은 내 수업의 마지막 프로젝트를위한 Magic the Gathering의 생명 계수기입니다. 첫 번째 이미지는 사용자가 앱의 홈 화면에서 라이프 카운터 화면으로 이동할 때 화면에 나타나는 이미지입니다.
다음 은 사용자가 애플리케이션의 홈 화면에서이보기로 이동할 때 표시되는 이미지를 보여주는 링크 입니다.
사진에서 lifeCounterViewController라는 뷰 컨트롤러가 있고 그 뷰 컨트롤러 내부에는 두 개의 다른 뷰가 있다는 것을 알 수 있습니다. 이러한 뷰의 이름은 각각 player1View 및 player2View입니다.
각 뷰 안에 직사각형이 그려집니다. CGRect 클래스의 멤버입니다. 다음 코드는 코코아 터치 스위프트 파일에서 가져온 것입니다. 그리기 기능에 대한 재정의가있는 코드가 포함되어 있습니다.
//
// player1LifeCounterDrawing.swift
import UIKit
class player1LifeCounterDrawing: UIView {
let MagicRed = UIColor.init(red: 247.0/255.0, green: 170.0/255.0, blue: 146.0/255.0, alpha: 1.0)
let Purple = UIColor.init(red: 102.0/255.0, green: 0.0/255.0, blue: 204.0/255.0, alpha: 1.0)
let Magenta = UIColor.init(red: 102.0/255.0, green: 0.0/255.0, blue: 51.0/255.0, alpha: 1.0)
let Orange = UIColor.init(red: 255.0/255.0, green: 166.0/255.0, blue: 0.0/255.0, alpha: 1.0)
let Plum = UIColor.init(red: 179.0/255.0, green: 0.0/255.0, blue: 89.0/255.0, alpha: 1.0)
let Emerald = UIColor.init(red: 0.0/255.0, green: 204.0/255.0, blue: 102.0/255.0, alpha: 1.0)
let Teal = UIColor.init(red: 0.0/255.0, green: 153.0/255.0, blue: 153.0/255.0, alpha: 1.0)
let SlateBlue = UIColor.init(red: 0.0/255.0, green: 153.0/255.0, blue: 255.0/255.0, alpha: 1.0)
let Forest = UIColor.init(red: 51.0/255.0, green: 153.0/255.0, blue: 51.0/255.0, alpha: 1.0)
let NavyBlue = UIColor.init(red: 51.0/255.0, green: 102.0/255.0, blue: 153.0/255.0, alpha: 1.0)
let MagicBlue = UIColor.init(red: 157.0/255.0, green: 216.0/255.0, blue: 255.0/255.0, alpha: 1.0)
let MagicBlack = UIColor.init(red: 194.0/255.0, green: 179.0/255.0, blue: 180.0/255.0, alpha: 1.0)
let MagicGreen = UIColor.init(red: 141.0/255.0, green: 203.0/255.0, blue: 158.0/255.0, alpha: 1.0)
var colorLibrary = [UIColor]()
var index = 0
func fillLibrary(library: [UIColor]) -> [UIColor]{
let capture = [UIColor](arrayLiteral: MagicRed, MagicBlue, MagicGreen, MagicBlack, Purple, Magenta, Orange, Plum, Emerald, Teal, SlateBlue, Forest, NavyBlue )
return capture
}
func calling(){
colorLibrary = fillLibrary(library: colorLibrary)
}
override func draw(_ rect: CGRect){
calling()
let lineWidth = CGFloat(3.0)
let rectangle = CGRect(
origin: CGPoint(x: 0, y: 0),
size: CGSize(width: bounds.maxX, height: bounds.maxY)
)
let rectPath = UIBezierPath(
roundedRect: rectangle,
byRoundingCorners: UIRectCorner(rawValue: 0),
cornerRadii: CGSize(width: 0, height: 0)
)
rectPath.lineWidth = lineWidth
rectPath.lineCapStyle = CGLineCap.square
if index >= colorLibrary.count{
index = 0
}
colorLibrary[index].setFill()
colorLibrary[index].setStroke()
index += 1
rectPath.stroke()
rectPath.fill()
}
}
이제이 솔루션은 작동하지만보기 흉합니다. 그리기 함수가 호출 될 때마다 볼 수 있듯이 colorLibrary라는 배열이 다시 초기화됩니다.
나는 이것이 메모리 낭비라는 것을 두려워하며 사용자가 버튼을 누를 때마다 setNeedsDisplay () 호출이 이루어지고 setStroke () 및 setFill () 메서드 색상이 반영되도록 변경되도록 솔루션을 찾는 데 도움이 필요합니다. [index]의 colorLibrary에 표시된 색상
어떻게 이룰 수 있습니까?
또한 제안 된 솔루션은 player1View 및 player2View 모두에서 작동해야합니다. player1View에만 코드를 표시했지만 player2View에서는 변경된 뷰를 식별하는 번호 만 동일합니다.
다시 말하지만, 이것은 메모리 낭비이며, 수업에 지원서를 제출해야하는 화요일 이전에이 문제를 해결하고 싶습니다. 그때까지 작동하는 솔루션을 얻을 수 없으면이 현재 솔루션을 사용하겠습니다.
Swift는 무엇보다도 중복을 방지하기 위해 지연 초기화 를 지원합니다 . 다음 colorLibrary
으로 대체 할 수 있습니다 .
lazy var colorLibrary: [UIColor] = [self.MagicRed, self.MagicBlue, self.MagicGreen,
self.MagicBlack, self.Purple, self.Magenta,
self.Orange, self.Plum, self.Emerald, self.Teal,
self.SlateBlue, self.Forest, self.NavyBlue]
이것은 배열 리터럴 ( [
... ]
)을 사용합니다.
이제 변수 colorLibrary
는 처음 사용할 때 초기화되고 그 값은 유지됩니다.
(정확하게하기 위해 변수 는 특히 다중 스레드 시나리오에서 두 번 이상 초기화 될 수 있지만 이는 사용자와 관련이 없습니다.)
또 다른 메모에서는 다음과 같은 코드로 색인을 관리합니다.
if index >= colorLibrary.count{
index = 0
}
// use index...
index += 1
이와 같은 인덱스를 관리하는 일반적인 방법은 모듈 식 산술 을 사용하는 것입니다 . 즉, 최대 값에 1을 더하면 최소값이됩니다. (실제 예를 들어, 주행 거리계 또는 전기 계량기의 카운터를 고려해보십시오.이주기는 모두 0에 도달 한 후 9 개가됩니다.)
모듈 식 산술은 mod 연산자를 사용하여 수행 할 수 있으며 %
,이를 위해 나눗셈 의 나머지 를 반환하는 것으로 생각할 수 있습니다 . 위의 코드 개요는 다음과 같습니다.
// use index...
index = (index + 1) % colorLibrary.count
그리고 if
피합니다.
HTH
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다