배열의 값을 사용하여 CGRect의 색상을 변경하려면 버튼을 누릅니다. 어떻게 이룰 수 있습니까?

BradleyGamiMarques

안녕하세요 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에서는 변경된 뷰를 식별하는 번호 만 동일합니다.

다시 말하지만, 이것은 메모리 낭비이며, 수업에 지원서를 제출해야하는 화요일 이전에이 문제를 해결하고 싶습니다. 그때까지 작동하는 솔루션을 얻을 수 없으면이 현재 솔루션을 사용하겠습니다.

CRD

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관