UIAlertController 사용법

iDev 2016. 1. 23. 18:59


난이도: 하


오랜만에 iOS 코딩을 하려니 많은게 바뀌었다. 


UIAlertView는 9.0에서 아래와 같이 deprecated 되었고, UIAlertController를 사용하는 것을 권장한다.

@available(iOS, introduced=2.0, deprecated=9.0, message="UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead")


그리고 UIActionSheet도 UIAlertController를 사용하면 된다. 참고로 UIActionSheet는 아래와 같이 iOS 8.3에서 deprecated 되었다.

@available(iOS, introduced=2.0, deprecated=8.3, message="UIActionSheet is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleActionSheet instead")


사용법

let alertController = UIAlertController(title: "Test Title", message: "Test Message", preferredStyle: UIAlertControllerStyle.Alert)
// .Alert .ActionSheet

let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { (UIAlertAction) -> Void in
  print("Okay")
}
alertController.addAction(okAction)

let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (UIAlertAction) -> Void in
  print("cancel")
}
alertController.addAction(cancelAction)

let destructiveAction = UIAlertAction(title: "Destructive", style: UIAlertActionStyle.Destructive) { (UIAlertAction) -> Void in
  print("Destructive")

}
alertController.addAction(destructiveAction)

self.presentViewController(alertController, animated: true) { () -> Void in
  print("presentViewController")
}

Alert과 ActionSheet의 구분은 preferredStyle로 구분을 해주면 되고 나머지는 동일하다. 



Alert과 ActionSheet 공통으로 주의해야 할 점은 .Default와 .Destructive는 여러 개를 .addAction해서 추가 해도 되는데, .Cancel은 2개 이상 만들어서 self.presentViewController 하면 crash 된다.


UIAlertController를 만들고, 각각의 UIAlertAction을 추가해주면 된다. 워낙 간단하니 다른 설명은 하지 않도록 하겠다.



Posted by KraZYeom
TAG iOS 9

댓글을 달아 주세요

Anime Expo Plays Japanese Gymnast Game! 이 영상의 요약판을 페이스북에서 접하였다. 그리고 생각이 든 것은. 한.번. 구.현.해.보.자. 


얼핏 보면 원리는 간단해 보였다. 그냥 회전 시키다가. 버튼을 누르면 손을 놓기. 그래서 오프라인으로 한 번 주문해서 정확한 원리를 분석해보고 느끼고 싶어서 구입을 하려고 열심히 찾았다. 박스에 테츠보-쿤이라고 적힌 것을 읽을 수 있어서 일단 Tetsubo-kun 영어로 검색 해보니 $70 정도 가격이다. 이게 뭐라고 8만 5000원이야. 배송비까지 하면 약 10만원. 


그래서 일본 아마존에서 てつぼうくん으로 검색을 하니 물건이 나온다. 


大車輪てつぼうくんで神業炸裂 대활약 철봉군! 신기작렬?


http://www.amazon.co.jp/タカラトミー-大車輪てつぼうくん-【日本おもちゃ大賞2014-コミュニケーション・トイ部門-優秀賞】/dp/B00KMPA9N6/ref=sr11?ie=UTF8&qid=1451627865&sr=8-1&keywords=大車輪てつぼうくん

3,980엔, 무게는 1kg이며 박스 크기는 생각보다 크다. 한국까지 배송을 받으려니 이것도 한 5.5만원 정도 들어갈 것 같다. 부피가 생각보다 커서 무피 무게가 적용되면 ... 6-7만원. 이게 뭐라고.


그래서 유투브를 더 찾아보았다. 사람들은 열심히 사서 리뷰를 하니까... 

   

이 영상을 보니 대충 감이 왔다. 원리는 아주 간단하지만, 생각과는 달리 간단하지 않았다.


노란 버튼을 누르면 다리가 접힌다. 얼핏 보면 봉이 돌아가서 사람이 돌아가는 것 처럼 보이지만 7분 24초 쯤에 노란버튼을 누를 때 살펴보면 다리가 접힌다. 그네 탈 때 다리를 접었다가 폈다가 하면서 그네를 타듯이 비슷한 물리 원리 이다. 그래서 회전을 할 때 노란 버튼을 적절히 잘 눌러야 한다. 


빨간 버튼을 누르면 철봉에서 손이 때어진다. 이 때 회전각으로 사람이 날아가는데 팔은 위로 펴진 상태가 고정인가 보다. 다리는 평상시에는 굽혀지지 않나보다. 날아가더라도 팔-몸통-다리 이렇게 곧게 펴져있다.


당연히 다리쪽에 무게 중심이 있어야만 다리가 먼저 바닥에 닿을 것으로 추측은 되나 확실하게 모르겠다. 발바닥에 굵은 벨크로가 있어서 착륙 지점에 닿기만 하면 무조건 착지가 된다. 아닐 경우는 그냥 철퍼덕. 


자 원리는 간단하다. 팔과 몸통은 어차피 붙어 있기 때문에 한 부분이라고 생각하면 된다. 그리고 다리 쪽에 질량을 좀 더 주고, 다리와 몸통은 Joint? 로 연결하면 될려나... 



2D로 만들면 옆 모습으로 밖에 보이지 않는다. 딱히 느낌이 살지 않을 수 있다. 하지만 3D로 구현을 하려면 최소한 Unity는 배워야 하는데, Unity는 몇 번 시도했다가 나에게 맞지 않아서 매번 실패. 


일단 2D로 프로토타입이나 한 번 만들어 보자. 딱히 엄청난 물리 효과가 필요한 것도 아니고 대충 해놓으면 물리 엔진에서 이것 저것 다 구현해주니 어렵지는 않아 보인다. Joint로 하는게 맞나? 


철봉과 손, 다리와 몸통만 연결하고 버튼을 누르면 다리만 왔다 갔다 하면 몸은 알아서 회전 할 것이다. 


corona, cocos2d, SpriteKit 으로 만들면 될 것이다.


자 이번에는 Swift도 써먹을겸해서 SpriteKit으로 다시 해보자.

Posted by KraZYeom

댓글을 달아 주세요

  1. scr 2016.01.01 22:19  댓글주소  수정/삭제  댓글쓰기

    저랑 똑같은 생각을 하셨군요 ㅋㅋㅋ 페북에서 영상보고 아 바로 만들어야지 했는데 역시 사람 생각은 똑같나봅니다.

Apple TV Tech Talks 개최

iDev 2015. 11. 11. 08:09



2013년에 마지막으로 iOS Tech Talks라는 이름으로 WWDC에서 iOS 부분만 다루는 개발자 투어 콘퍼런스를 올해는 Apple TV Tech Talks로 이름을 바꾸어서 돌아왔습니다.


이번 WWDC '15 에서는 Apple TV에 대해서는 전혀 다루지 않았습니다. 그래서 그런지 iOS 보다는 Apple TV에 더 중점을 가지고 진행하는 것 같습니다. 이제는 취미가 아니라 집중된 카테고리를 삼아도 될 때가 된 것 같습니다. 2011년에는 일본에 지진이 일어나서 일본 대신 한국에서 개최하기도 했습니다. 


투어 도시와 날짜는 아래와 같습니다. 

  • Toronto December 7, 2015
  • Los Angeles December 10, 2015
  • Austin December 14, 2015
  • Seattle December 16, 2015
  • Cupertino December 17, 2015
  • Cupertino December 18, 2015 
  • Berlin January 8, 2016
  • London January 11, 2016 
  • New York January 12, 2016 
  • Tokyo January 21, 2016
  • Sydney February 3, 2016


애플 개발자들에게 메일로 등록 신청 링크가 돌아갔고 신청을 하면 애플에서 완전 추첨 방식이 아닌 애플 스토어에 앱들이 있는 것을 참고해서 선별하는 것 같습니다. 


세션은 오전 9시부터 12시까지 tvOS의 앱 개발에 대한 간단한 이야기를 시작해서 오후 1시부터 5시까지 깊은 개발에 대한 이야기를 다룹니다.


티켓은 판매, 양도, 교환, 경매와 같이 다른 사람에게 양도를 할 수가 없습니다. 단, 같은 개발 팀에게는 메일을 보내서 양도를 할 수 있는 것 같습니다.


11월 13일 10시(PST기준)까지 등록을 받고, 16일부터 메일을 통해서 참가 가능 소식을 받아 볼 수 있습니다.


iOS와 tvOS를 직접 개발은 하지는 않지만 새로운 게 나오면 관심은 있고 언제 밥 벌이가 될지 모르기 때문에 알아는 놔야 할 것 같고, 일단 당첨될리도 없고 외국이긴 하지만 가까운 일본으로 신청을 해놨습니다. 




Posted by KraZYeom

댓글을 달아 주세요


iPhone 6s가 출시되면서 iOS 9에는 3D Touch와 관련된 기능이 많이 추가 되었다. 그중 하나가 Home Screen Quick Actions 기능이다. 퀵 액션, 단축 버튼과 같은 기능을 한다. 홈 스크린에서 아이콘을 꾹! 힘있게 누르면 퀵 엑션을 지원하는 앱은 바로 가기 리스트가 나타나고 없는 앱들은 탭틱 진동이 살짝 일어난다. 6s 미만의 아이폰에서는 지원하지 않는다.


앱에 3D Touch 관련 기능을 추가할 때 가장 쉬운것이 퀵 액션이다. 코드 몇 줄만 작성을 하면 기존에 앱에 코드 구조를 바꿀 필요가 없이 퀵 액션을 추가할 수 있다.


퀵 액션은 코드 상에서는 Shortcut Item이라고 부른다. 숏컷 아이템은 크게 두 가지로 나뉜다. 

  1. Static Shortcut Item
  2. Dynamic Shortcut Item

스태틱 숏컷 아이템은 plist에서 설정을 하고 변경할 수 없다. 하지만 앱에 정의 되어 있기 때문에 최소한 한번을 실행하지 않고 설치만 했을 때에도 퀵 액션을 만들 수 있다.


반면에 다이나믹 숏컷 아이템은 앱이 실행되고나서 UIApplication.sharedApplication().shortcutItems에 할당 하기 때문에 최소한 한 번 은 실행을 해줘야 다음에 나타나게 된다. 앱을 업데이트 하거나 재설치 할 때도 마찬가질수 도 있다. 하지만 고정되지 않고 원하는대로 아이템을 변경할 수 있다. 


애플의 기본앱인 사진기 앱과 전화 앱을 비교해 보면 그 차이를 알 수 있다. 사진기 앱은 기능이 딱 4개로 정해져 있다. 하지만 전화 앱은 Favorites에 설정한 상단 4명을 보여줄 수 있다. 퀵 액션에 보여주고 싶으면 리스트의 순서를 바꾸면 된다. 


원래 하고 싶었던 것은 앱을 실행 하지 않고 퀵 액션만 부르면 랜덤값으로 계속해서 변경을 해서 보여주고 싶었다. 하지만 그 방법은 없는 것으로 보인다. 최소한 한 번 이상의 앱이 실행되어야 계속 해서 랜덤값으로 할당 해 줄수 있다.


가장 간단하게 Dynamic ShortItem을 만드는 방법을 알아보도록 하자. 


앱상 어디에서 구현해도 상관은 없지만 최소한 한 번은 호출 되어야 보이기 때문에 func application(application:, didFinishLaunchingWithOptions:) 에 구현을 하면 되긴한다. 하지만 앱이 첫 번째로 실행 되었을 때만 호출이 되고 그 다음에는 호출 되지 않으므로 지속적인 변경을 위해서는 applicationDidBecomeActive(application:)에 넣으면 다음에 앱이 열였을 때도 이 메소드가 호출이 되어서 다시 숏컷 아이템을 재 할당할 수 있다.


UIApplicationShortcutItem을 만들고, UIApplication.sharedApplication().shortcutItems 에 넣으면 끝이다. 정말 간단하지 않는가? 


글로벌 변수로 스트링 값을 가진 배열을 하나 만들었다.

var randString : [String] = ["김밥", "라면", "만두", "김치찌개", "로브스터", "냉면", "비냉", "떡볶이"]


그리고 앱이 실행되면 ShortItem에 할당할 아이템을 아래와 같이 구현한다.

func applicationDidBecomeActive(application: UIApplication) {
  // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
  print("applicationDidBecomeActive")

  let count = UInt32(randString.count);
  
  // 1.
  let item1 = UIApplicationShortcutItem.init(type: "type1", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let item2 = UIApplicationShortcutItem.init(type: "type2", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let item3 = UIApplicationShortcutItem.init(type: "type3", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let item4 = UIApplicationShortcutItem.init(type: "type4", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let shortcutItems : Array = [item1, item2, item3, item4]
  
  // 2.
  UIApplication.sharedApplication().shortcutItems = shortcutItems

}
  1. shortcutItems에 넣을 UIApplicationShortcutItem을 하나 만든다. type은 퀵 액션으로 호출 되었을 때 구분을 위한 것이다. localizedTitle은 텍스트로 들어갈 값이고 localizedSubtitle은 밑에 추가 설명글이다. 옵셔널이다. icon은 시스템에 내장된 아이콘을 사용해도 되고, 아니면 커스텀 아이콘을 사용해도 된다. userInfo에는 추가적으로 들어갈 정보이다. 옵셔널이다.

  2. 최대 4개의 퀵 액션을 지원하므로 4개의 아이템을 배열에 넣고 shortcutItems에 할당한다.

이렇게 하고 빌드&런을 하면 아이콘을 꾹 누르면 퀵 액션이 보여진다. 그리고 실행했다가 다시 누르면 아이템들이 변경되는 것을 확인 할 수 있다. 


하지만 숏컷을 눌러서 이제 그 type에 맞는 액션을 호출 하게 하려면 AppDelegate에서 func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void)를 구현해줘야 한다. 


func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
  
  switch shortcutItem.type {
  case "type1":
    print("type1")

  case "type2":
    print("type2")
  
  case "type3":
    print("type3")
  
  case "type4":
    print("type4")
    
  default:
    print("test")
  }
}

앞에 UIApplicationShortcutItem.init에서 type으로 설정한 것이 shortcutItem.type이다. 이것으로 구분하여 각각에 퀵 액션에 대한 것을 구현 할 수 있다.


리스트 순서와 아이콘의 위치는 3D Touch Human Interface Guide Line을 참조하도록 하자.


홈 화면에서 아이콘이 상하좌우 위치에 따라서 퀵 액션(ShortCut)의 순서(order)와 아이콘의 위치가 다르게 나온다. 아이콘에서 가까운쪽이 순위가 높은거고, 아이콘의 위치는 아이콘에 가까운곳에 숏컷 아이콘이 오게 된다.


이상 아주 간단하게 퀵 액션 만드는 방법을 살펴 보았다.




Posted by KraZYeom

댓글을 달아 주세요


최근에 Submile Edtior를 버리고 Atom을 사용하다 보니 코딩시에는 문제가 없었는데, 번역을 하는 과정에 긴 문장으로 한글로 작성을 하다보니 아래 그림과 같이 글이 잘리는 현상을 발견했다. (한국어 뿐만 아니라 한국어, 중국어, 일본어(CJK) 등 2바이트를 사용하는 문자에서 동일한 현상이 일어난다.) 이런 이슈가 발생하고 보고 된지는 꽤 오래되었다. 하지만 Atom 코어 부분에서 이 문제를 해결하지는 않았다. 

영문자 기준으로 글자수를 계산해서 줄바꿈이 일어나다 보니 한국어 같은 경우는 줄바꿈이 일어나질 않는다.


이슈를 따라가다 보니 이 문제점을 해결한 2개의 페키지가 있다. 하나는 Japanese Wrap이고 또 하나는 AtomicChar이다. 


Japanese Wrap가 먼저 만들어졌으나 일본어를 위한 옵션값이 많고 한국어 경우에는 줄바꿈이 일어나긴 하나 제대로 계산하지 않아서 너무 빨리 줄바꿈이 일어나서 이쁘지 않게 줄바꿈이 된다. 개발자가 일본어 외 사용자에게 특정 옵션을 끄라고 하지만 꺼도 여전히 문제가 있다.

그래서 다른 페키지인 AtomicChar를 사용하니 앞선 문제점이 깔끔하게 해결되었다. 


제작자 분의 영어 문장을 보니 한국인인 것 같았는데 검색을 해보니 한국인이 맞는것 같다. 감사합니다. ㅠㅠb



Posted by KraZYeom

댓글을 달아 주세요