2018년 4월 18일 수요일

Xcode 9 에서 컬러 리터럴 사용하기

코드에서 색상 값을 UIColor()에 생성자에 RGB 값으로 코딩을 하면 무슨 색인지 코드만 보고는 알수가 없다.



Xcode에서는 이러한 점을 고려하여 위와 같이 color literal을 지원하게 되었다.
색상이 Xcode에디터에서 문자 처럼 표시 된다.

color lteral을 코드에 적용 하는 방법은 다음과 같다.

color literal을 타이핑 하면 다음과 같이 코드 완성이 이루어지려 한다.


에디터에서 색상을 더블클릭 하면 색상 선택 창이 나타난다.




Other를 선택 하여 RGB 및 alpha 값을 적용 하여 원하는 색상 리터럴 문자를 만들수 있다.




이렇게 코드를 작성하면 실제는 colorLiteral() 로 코딩되어 있고 Xcode editor 상에서는 색상으로 표시되어 가독성이 좋다.











2018년 4월 12일 목요일

Xcode 9 에서 markdown파일을 렌더링 하여 보기




Xcode에서 .md 파일을 추가 할수 있다.
하지만 기본은 그냥 편집 할 수 있게만 되고 미리보기라 든지 그런 기능이 없다.


위에글은 링크된 파일을 다운로드 받으면 Xcode 프로젝트가 있는데 Xcode로 오픈해 보면 정말 README.md 가 렌더링 되서 보여준다.

아무런 차이도 없는데 해당 프로젝트는 그렇게 보여준다.
위 리크에서 설명 하듯이 답은 .xcodesamplecode.plist 파일이 프로젝트 (패키지 내용보기) 내부 에 있는 것이다. 파인더에서도 디폴트는 보여지지 않기 때문에 터미널을 이용하여 ls -al 로 확인 하였다.

sparrow-mac-mini:ARKitExample.xcodeproj sparrow$ ls -al
total 56
drwxr-xr-x@ 6 sparrow  staff    204  4 12 22:18 .
drwxr-xr-x@ 9 sparrow  staff    306  4 12 22:03 ..
-rw-r--r--@ 1 sparrow  staff    182  8  8  2017 .xcodesamplecode.plist
-rw-r--r--  1 sparrow  staff  24272  4 12 22:07 project.pbxproj
drwxr-xr-x@ 5 sparrow  staff    170  4 12 22:04 project.xcworkspace
drwxr-xr-x  3 sparrow  staff    102  4 12 22:04 xcuserdata

현재 작업중인  프로젝트는 워크스페이스로 구성되어 있었는데 여러 포함된  프로젝트 파일중에 README.md 파일을 추가 했고 렌더링 된 결과가 나올 줄 알았지만 결과는 아무런 변화가 없다.

하여 잘못된 글로 생각 했다.

워크스페이스로 된 프로젝트에서는 .xcodesamplecode.plist 파일을 workspace 디렉토리에 넣어야 된다.

결국 이글은 정확하게 잘된다.

구지 ARKitExample.xcodeproj을 다운 받지 않고도

터미널에서 워크스페이스 파일이나 xcode 프로젝트 파일에 디렉토리에 들어가서 .xcodesamplecode.plist 파일을 생성 하면 될 것으로 보인다.

해당 파일의 냉용은 다음과 같다.

sparrow-mac-mini:ARKitExample.xcodeproj sparrow$ cat .xcodesamplecode.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array/>
</plist>


이파일이 프로젝트 디렉토리 (패키지내용보기) 또는 터미널에서 cd  진입 하여 .xcodesamplecode.plist (ARKitExample.xcodeproj) 에 있는 파일이나 직접 만들어 넣으면 xcode가 markdown 파일을 렌더링 해서 보여준다.

단! 렌더링 되면 수정 xcode에서는 수정이 되지 않는다.

Visual Studio Code로 편집 수정하여 Xcode 프로젝트에 추가하면 멋진 도큐먼트를 포함하는 프로젝트가 될 것이다.

그리고 표문법은 적용 되지 않는다.

그래도 이정도면 쓸만 하다.

2018년 3월 9일 금요일

UIPickerView의 선택된 텍스트 색상 변경, 선택 라인의 색상 변경을 하려면?

어쩔수 없이 UI작업이 디자인 가이드를 우선으로 해야 하는 경우 기본적인 UIPickerView를 변경 해야 하는 경우가 있다.


UIPikckerView를 디폴트로 사용하면 데이터소스로 데이터 값정도를 변경 할 수 있다.

위와 같이 선택라인의 색상을 변경 시키거나 선택된 텍스트의 컬러를 변경 시키는 작업은 코드를 이용 해야 한다.

첫번째 선택된 Text의 컬러를 변경 하기 위해서는 AttributeString을 리턴 하는 아래의 메서드를 구현 해야 한다.

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString?
{

}

선택된 row 일때와 그렇지 않을때의 컬러를 결정 하여 NSAttributedString을 리턴 해야 한다.

1,2,3,4와 같은 UIPickerView 의 표출될 문자열 스트링 어레이가. pickerData 인 경우 
아래의 코드는 선택된 텍스트의 색상을 blue, 선택되지 않은 색상은 black으로 표출 하는 코드이다.
    func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
        var color: UIColor!
        if pickerView.selectedRow(inComponent: component) == row {
            color = UIColor.blue
        } else {
            color = UIColor.black
        }
        
        let attributes: [NSAttributedStringKey: Any] = [
            NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): color,
            NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont.systemFont(ofSize: 15)
        ]
        
        return NSAttributedString(string: pickerData[row], attributes: attributes)
    }



다음은 선택 라인의 색상을 변경 해야 하는데 기본 UIPickerView는 Property로 제공하지 않는다.

UIPickerView를 서브클래싱 하여 CustomPickerView class를 생성 한다음 다음의 두 라인이 을 찾아서 색상을 변경 하는 코드를 추가 해야 한다.

didAddSubview 메서드를 오버라이딩 하여 서브뷰 중에 height가 1인 값의 즉 두선을 찾아 색상을 변경 한다.

 @IBDesignable와 @IBInspectable을 이용하여 스토리보드에서 변경 사항을 확인 까지 가능 하도록 다음과 같이 클래스를 생성 하면 된다.

//
//  CustomPickerView.swift
//  datetimepickerDemo
//
//  Created by  sparrow on 2018. 3. 8..
//  Copyright © 2018년  sparrow. All rights reserved.
//

import UIKit

@IBDesignable
class CustomPickerView: UIPickerView
{
    @IBInspectable var selectorColor: UIColor? = nil
    
    override func didAddSubview(_ subview: UIView) {
        super.didAddSubview(subview)
        if let color = selectorColor
        {
            if subview.bounds.height <= 1.0
            {
                subview.backgroundColor = color
            }
        }
    }
}


스토리 보드상에서 selectorColor을 설정 하면 바로 색상이 적용된다.








2018년 3월 8일 목요일

가로 모드에서 특정 뷰가 전체 화면이 되는 앱을 autolayout으로 어떻게 구현 하는가?

세로 모드에서 컨텐츠가 가운데 표시되고 상단과 하단에는 네비게이션 바 부터 정보를 보여주는 Label 하단에는 각종 버튼이 있다고 하자.

이러한 상태에서 가로모드로 전환을 하면 가운데 컨텐츠가 전체 화면으로 변경 되는 앱을 만든다고 하면 어찌 하는가?
아래 그림을 참조






화면 전환을 인지 하는 코드는. willTransition() 메서드로 인지 할 수 있다.

UIDevice.current.orientation.isLandscape 의 값을 확인 하여 현재 landscape 모드인지 확인이 가능 하다.

이럴때 가운데 컨텐츠의 autolayout constraint 값을 (0)으로 변경 하면 쉽게 해결 할 수 있다.
즉 세로모드로 IB에서 디자인을 하고 autolayout constraint를 적용 할때 Video 라는 글이 있는 검정색 뷰의 부모 뷰에 대한 constraint Align top to:와 Align Bottom to:를 IBOutlet으로 연결하여
코드로 값을 조정 하면된다.

나머지 나비게이션콘트롤러의 바나, 레이블, 버튼등도 코드로 isHidden 값을 정해 주면 된다.

하여 완성된  ViewController의 코드는 다음과 같다.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var topContraint: NSLayoutConstraint!
    @IBOutlet weak var bottomConstraint: NSLayoutConstraint!
    @IBOutlet weak var infoLabel: UILabel!
    @IBOutlet weak var controlButton: UIButton!
    
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape == true {
            topContraint.constant = 0
            bottomConstraint.constant = 0
            self.navigationController?.isNavigationBarHidden = true
            infoLabel.isHidden = true
            controlButton.isHidden = true
        } else {
            topContraint.constant = 122
            bottomConstraint.constant = 300
            self.navigationController?.isNavigationBarHidden = false
            infoLabel.isHidden = false
            controlButton.isHidden = false
        }
    }


}

2018년 3월 1일 목요일

Xcode 9 GitHub 계정 지원 기능 알아 보기

xcode 9 이 되면서 Github 계정 연동 기능이 추가 되었다.
기존 버젼도 git을 지원 하기는 하였지만 좀더 많은 기능이 추가되었다.



특히 이번 버젼에는 좌측 Navigator 화면에 Source Control Navigator가 추가 되었고 직관적으로 볼수 있게 되었다.

1. github계정 생성



메뉴 Xcode -> Preferences -> Accounts
에서 Github 계정을 추가 할 수 있다.





메뉴 Xcode -> Preferences -> Source Control -> Git
에서 git 관련 설정을 할 수 있다.


2. Source Control Navigator 활용





좌측 Source Control Navigator ( Cmd + 2) 화면에서는 브랜치 전환 및 git message를 확인 할 수 있는 기능이 새롭게 추가 되었다.


3. github 계정에 원격 리포지토리 생성





Source Control Navigator에서. Remotes 마우스 우클릭으로 원격 리포지토리 생성이 가능 하다. 계정 설정에 연결된 GitHub 계정에 원격 리포지토리를 생성 할 수 있다.








branch 생성 branch 간 전환도 가능 하다.

4. 머지



test브랜치를 만들고 브랜치 전환을 하여 수정한 다음 손쉽게 마스터 브랜치에 머지 할 수 있다.


6. 소스 컨트롤 메뉴



상단 메뉴에서 Source Control 메뉴 GitHub 프로젝트에 대한 Clone , Repositores 생성 , Commit, Push, Pull 등 모든 기능을 할 수 있는 메뉴가 존재 한다.



이상으로 간단하게 Xcode 9 에 새롭게 추가된 github 연동 및 git 관련 기능을 살펴 보았다.


2018년 2월 8일 목요일

Xcode codesnippets 여러 맥머신에서 동일하게 동기화 하기 with iCloud version

https://mtsparrow.blogspot.kr/2016/01/xcode-code-snippets-key-binding-font.html

이미 드랍박스를 이용하여 코드 스니핏을 동기화 한적이 있다.

폰트, 단축키도 동기화 가능 하다.


이번에는 같은 방법으로 iCloud 드라이브를 이용하는 것으로 동일한 방법이다.

아이클라우드 도큐먼트 디렉토리에 XcodeDocs를 생성 한다.

$ mkdir ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/XcodeDocs

Xcode의 코드 스니프 디렉토리를 아이클라우드 디렉토리에 이동 한다.
$ mv -v ~/Library/Developer/Xcode/UserData/CodeSnippets ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/XcodeDocs/

링크를 걸어준다. 다른 머신도 아래와 같이 링크를 걸어 주면 된다.
$ ln -s ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/XcodeDocs/CodeSnippets/ ~/Library/Developer/Xcode/UserData/CodeSnippets






2017년 12월 19일 화요일

macOS High Sierra에서는 이제 한/영 전환을 CapsLock으로 해야 하는게 옳은듯 하다. 프로그래머 라면..

http://macnews.tistory.com/4540

위글은 백투더맥에서 CapsLock 설정에 대한 글이고

프로그래머 입장인 나로서는 간마에 XCode 9를 열어보고 당황할수 밖에 없었다.

코드 입력 하는 곳에서 한/영 전환이 충돌이 나서 계속 타이핑이 삐 그덕 거리는 것이다.



위와 같이 Xcode 9에서 코드 완성이 디폴트로 ^Space조합으로 되어 있어 한영 전환을 ^Space로 설정 하면 문제가 생기는 것이다.

eclipse도 디폴트로 비슷한 기능이 ^Space로 설정되어 있고 이제 한영전환 키를 ^Space로는 개발툴에서 사용하기 어렵게 된것 같다.

처음 mac을 접할때 cmd+space는 맘에 들었느데 중간에 ^Space로 반강제로 갈아 타는 느낌이 었는데..

이제 CapsLock으로 정착 해야겠다.