Apple App Store에 처음으로 App을 올려보았다.

iOS App 개발은 시작하였으나, App Store에 App을 올려본 경험은 없었다. 그동안 해오던 일도 끝나고, 3월부터는 완전한 백수로 거듭났기에 이번 기회에 빠르게 App을 만들어 올려보았다.

대략 1주일 정도에 걸쳐 다양한 작업을 했었고, 기억에서 잊히기 전에 생각나는 것들을 마구잡이로 남겨본다.

목공을 도와주는 계산기

어떤 App을 만들까 고민을 하다가, 취미인 목공과 관련된 것을 만들어 보는 것으로 방향을 정했다. App Store에서 목공으로 검색을 해보니 별다른 게 없었다.

근사하고 멋진 App이 아닌, App Store에 App을 올려보는 것이 목표이기 때문에 우리나라만을 대상으로 했다. 즉, 다국어 미지원으로 일거리를 확 줄였다.

취미로 목공을 하면서 가끔 계산기를 사용할 때가 있는데, 그것을 앱으로 구현하기로 했다.

  • 제재목을 거래할 때 재(材)라는 단위로 계산하는 때가 있다.
  • 해외 자료의 도면의 크기가 Feet, Inch로 표시되어 있다.

재(材)

간혹 제재목을 거래할 때, 재(材)라는 단위를 사용해서 목재를 거래하는 때가 있다.

재(材)는 동양에서 사용된 도량형 단위인 “척근법”일본에 정착하여 만들어진 도량형 단위에서 부피를 측정할 때 사용하는 단위이다. 일본 식민지를 거치면서 이 단위가 목재 산업 전반에 사용되게 되었다고 한다. 여전히 일본 발음인 “사이”라고도 한다.

1 재(材)는 가로, 세로가 각각 1이고 길이가 12 인 목재를 이야기한다. 1 치는 30.3mm이고, 1 자는 10 치의 길이를 가진다.

1 자 = 1 치(30.3mm) * 1 치(30.3mm) * 12 자(3,636mm) = 333,8175.24

피트, 인치

목공 관련 외국 자료를 보면 야드파운드법으로 표시된 경우가 많다. 그중에서 피트와 인치로 표시되는 경우가 많다.

1 인치는 25.4mm이고, 1 피트는 12 인치(304.8mm)이다.

App 구현

앞에서 이야기한 두 단위를 미터법의 수치를 입력하여 계산하거나, 미터법의 단위로 변환해주는 기능을 제공하는 것이 목표다.

스토리보드

전체적인 UI의 구성은 다음과 같다.

  • Tab Bar Controller로 2가지 기능 선택
  • Navigation Controller를 이용해 상단의 Bar에 설정 버튼을 위치
  • Table View Controller를 이용해 각 기능을 위한 UI를 배치

스토리보드

이미지 작업

코딩만 할 줄 알기에 App에 필요한 이미지 작업이 걸림돌이었다. 새로 만들 능력이 없기에 있는 것을 가져다 사용했다.

아이콘은 Icons8 Lite 앱에 있는 것을 이용했다. 라이센스 표시 및 Icons8 사이트 링크 표시해주면 사용 가능하다고 이해했다.

아이콘 이미지를 iOS Human Interface Guidelines 문서의 Icon and Image Sizes에 맞게 크기를 맞췄다.

App 아이콘 이미지를 만들 때는 pixabay에서 이미지를 내려받아 사용했다. 이미지마다 사용권을 확인하여 문제 안 되는 이미지를 골라 사용했다.

예전에 사놓고 사용하지 않았던 Pixelmator를 사용해서 이미지 작업을 했다. 사용법을 몰라 찾아가면서 더듬더듬 이미지 작업을 했다. ㅡ,.ㅡ;

숫자 입력을 위한 UITextFieldDelegate

App 구현에서 신경 쓴 부분은 UITextField에 숫자만을 입력받고, “1,234.02” 형태로 표시해주는 부분을 구현한 부분이다. App에서 사용하는 UITextField 모두가 같은 형태이기에 별도의 클래스로 구현해서 재활용했다.


class TextFieldDelegateForNumber: NSObject, UITextFieldDelegate {
    
    var updateNumber: (number: NSNumber) -> Void
    
    init(updateNumber: (number: NSNumber) -> Void) {
        self.updateNumber = updateNumber
        
        super.init()
    }
    
    func checkValidNumber(string: String) -> Bool {
        if let _ = Double(string) {
            return true
        }

        return false;
    }
    
    // MARK: UITextFieldDelegate
    
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        
        var newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
        if newString == "" {
            newString = "0"
        }
        let numberString = newString.stringByReplacingOccurrencesOfString(",", withString: "")

        guard checkValidNumber(numberString) else {
            return false
        }

        let number = Double(numberString) ?? 0
        
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .DecimalStyle
        
        if numberString.hasSuffix(".") {
            formatter.positiveFormat = "#,##0.###"
            textField.text = formatter.stringFromNumber(number)! + "."
        } else {
            if numberString.containsString(".") {
                formatter.positiveFormat = "#,##0.0##"
            } else {
                formatter.positiveFormat = "#,##0.###"
            }
            textField.text = formatter.stringFromNumber(number)
        }
        
        updateNumber(number: number)

        return false
    }
}
	

숫자 값이 변경되었을 때, 호출되는 함수를 초기 인자로 받는다. 다음 처럼 사용된다.


    widthTextField.accessibilityIdentifier = "woodWidth"
    widthTextFieldDelegate = TextFieldDelegateForNumber() { number in
        self.width = Double(number)
    }
    widthTextField.delegate = widthTextFieldDelegate
	

Comments