2016년 11월 27일 일요일

[ios swift 3] 코드로 layout 잡기

storyboard에서 레이아웃을 잡은 후 기기에서 테스트해보면 원하는대로 제대로 안되는 경우가 있다.

(예로 scrollview에 label, image view등을 넣어서 위치를 잡은 후 label이 멀티라인이 되어야 해서 label 아래의 view등의 y값을 앱 실행단계에서 정해 주어야 할 때)

// 기존 값을 모두 무시하도록 한다. (storyboard 상에서 값을 지정한 경우)

view.translatesAutoresizingMaskIntoConstraints = false

// 각 constraint를 직접 설정한다.
// item에 원하는 뷰 지정
// attribute에 원하는 속성
// toItem에 기준이 될 view 지정
// constant에 거리 지정

let leading = NSLayoutConstraint(item:view, attribute:.leading, relatedBy:.equal, toItem:scrollView, attribute:.leading, multiplier:1, constant:16)


// 마지막으로 모든 설정들을 활성화 해준다.
NSLayoutConstraint.activate([leading,,,,])


// label에 멀티 라인 지정시 height 계산
label에 text 넣고
label.sizeToFit()를 실행 한 후 height값을 가져오면 된다.

[ios swift 3] navigationBar, tabBar 배경색 지정

네비게이션바와 탭바에는 기본적으로 투명도가 적용되어 있어서 인지 원하는 색상을 bar tint에 지정하는 것만으로는 안된다. 투명도설정을 제거해 주어야만 한다.

story board에서는
Bar Tint 색상 지정
Translucent 체크 해제

코드상으로는 아래와 같이
self.navigationController?.navigationBar.barTintColor = UIColor.black
self.navigationController?.navigationBar.isTranslucent = false

translucent 를 false로 할 경우 간혹 다른 이슈가 발생할 수 있다.

 tabbar를 생성후 안드로이드 처럼 위치를 위로 올렸을 경우 기존 tabbar 위치에 터치가 되지 않는 경우

이럴 경우에는 해당 viewcontroller에 아래와 같은 코드 삽입

self.extendedLayoutIncludesOpaqueBars = true

[ios swift 3] http json 통신

1. GET 방식

let url = URL(string:"")
var request = URLRequest(url:url!)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with:request) { data, response, err in
if err != nil {
Utils.Log("error::\(err)")
} else {
do {
let json = try JSONSerialization.jsonObject(with:data!, options:.mutableContainers) as! [String:AnyObject]

let status = json["status"] as! Bool
if status {
}
} catch {
Utils.Log("error::\(error)")
}
}
}
task.resume()

만약 데이터에 한글이 있을 경우
let link = "url string"
// 한글 처리
let url:URL = URL(string:link.addingPercentEncoding(withAllowedCharacters:.urlQueryAllowed)!)!


2. POST 방식

let json = ["type":value, "type":value] as [String:Any]
var jsonData:Data
do {
jsonData = try JSONSerialization.data(withJSONObject:json, options:.prettyPrinted)
} catch {
Utils.Log("error::\(error)")
return
}

let url:URL = URL(string:"")!
var request:URLRequest = URLRequest(url:url)
request.httpMethod = "POST"
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with:request) { data, response, err in
if err != nil {
Utils.Log("error::\(err)")
} else {
do {
let str = String(data:data!, encoding:.utf8)
Utils.Log("str::\(str)")
let json = try JSONSerialization.jsonObject(with:data!, options:.mutableContainers) as! [String:AnyObject]

let status = json["status"] as! Bool
if status {
}
} catch {
Utils.Log("error::\(error)")
}
}
}
task.resume()