Tumgik
koreandarren · 6 years
Text
iOS12의 Group notifications [1/2]
아마 이번 iOS 12 업데이트에서, 사용자/개발자들이 가장 먼저 체감할 수 있는 점은 Group Notification이 아닐까 싶습니다.
기존의 알림센터는 특별한 규칙 없이 모든 앱의 모든 알림을 보여줬다면, 이번 iOS12부터는 아래의 이미지처럼 앱 별로 자동으로 Group화 해서 보여줍니다.
Tumblr media
(이미지 출처: Apple)
왼쪽의 이미지는 총 세 개의 앱에서 온 여러개의 알림을 Group화 하여 보여주고 있으며, 그 중 메세지 Group을 tap했을 때는 오른쪽의 이미지와 같이 메세지 목록이 나타납니다. 또한, Group의 최상단에는 가장 최근에 받은 알림이 나타납니다.
그럼 여기서 카카오톡을 상상해 봅시다. 개발자가 별 다른 설정을 하지 않으면 iOS가 앱별로 알림을 Group화 하기 때문에, 수열이에게서 오는 메세지와 여자친구에게서 오는 메세지가 한 Group으로 묶이게 됩니다.
수열이에게서 온 메세지가 여자친구의 메세지를 덮어버려서 확인을 못했네요. 여자친구는 화가 나고, 헤어지고, 평생 솔로로 살다가 독거노인이 되고.. 암울한 미래가 펼쳐집니다.
그건 사용자도, 개발자도, 여자친구도, 수열이도 별로 원하는 결과가 아니겠죠. (제발 그렇다고 해주세요🙏)
그래서 추가된게 `Thread Identifier`입니다.
Thread Identifier
Thread identifier는 같은 앱이라도, 알림을 다양한 Group으로 분류할 수 있도록 도와줍니다. 즉, 하나의 카카오톡 앱이라도 알림별로 Thred identifier를 설정해주면, 수열이와 여자친구의 메세지들을 각각 Group 지어줄 수 있습니다.
수열이 메세지들의 Thread identifier를 `Suyeol`로, 여자친구 메세지들의 Thread identifier를 `Empty`로 설정하여 사용자에게 전송한다면, 사용자는 아래와 같이 2개로 분류된 알림을 받게 됩니다.
Tumblr media
(이미지 출처: WWDC)
그럼 수열이와의 우정도 영원하고, 여자친구와 헤어질 일도 없고, 결혼에 성공하여 딸 하나 아들 하나 오손도손 행복하게 잘 살겠죠?
그럼, 이 Thread identifier는 어떻게 적용할 수 있을까요?
서버를 통해 Remote notification을 전송한다면, 아래와 같이 APNS payload에 `thread-id`만 추가해주시면 됩니다. 당연히 각 그룹별로 유니크한 값이 들어가야겠죠?
Tumblr media
(이미지 출처: WWDC)
어플리케이션 단에서 Local notification을 전송한다면, 아래와 같이 `UNNotificationContent` 객체에 `threadIdentifier`를 설정하시면 됩니다.
Tumblr media
(이미지 출처: WWDC)
어때요, 참 쉽죠?
그런데, 잠깐! 혹시 첫번째 이미지에서 이상한 점을 느끼지 못하셨나요?
Tumblr media
맞습니다. 각각의 Group마다 알림 하단에 뜨는 설명이 다릅니다.
이런 내용을 `Group Summary`라고 부르며, 애플은 이 또한 customize 가능하게 만들어 주었습니다.
별도의 설정을 하지 않으면, 위 이미지의 Twitter 앱 처럼 `X more notifications`로 나타나게 됩니다.
그럼 위 이미지의 Calendar, Messages 앱 처럼 직접 group summary를 설정하려면 어떻게 해야할까요?
그건 다음 시간에 알아보도록 합시다... 피곤하네요.
자료 출처: WWDC
3 notes · View notes
koreandarren · 8 years
Text
[FBQuoteWebView]Facebook Quote Sharing in UIWebView
페이스북이 F8 2016에서 Quote Sharing 이란 새로운 공유 방법을 발표했다.
그래서 뚝딱뚝딱 만들어 보았다.
FBQuoteWebView
UIWebView의 Subclass로, 해당 웹뷰에서 문장을 선택하면 아래와 같이 `Share To Facebook`이라는 menu item이 나타나고, 해당 item을 이용해 해당 URL과 Quote를 함께 공유할 수 있다 :D
https://github.com/KimDarren/FBQuoteWebView
Tumblr media
https://github.com/KimDarren/FBQuoteWebView
0 notes
koreandarren · 8 years
Text
[iOS] 현재 프로젝트에서 사용 가능한 폰트를 알아보자.
아래의 코드를 프로젝트 아무곳에서나 입력을 하면..
for (NSString *familyName in [UIFont familyNames]) {     NSLog(@"* %@", familyName);     for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {         NSLog(@"\t- %@", fontName);     } }
이렇게 나온다!
Tumblr media
상단에는 Font-family, 하단에는 해당 Font-family에 존재하는 Font 이름들이 나온다.
여기에 나오는 폰트 이름을 (-로 시작하는..) 이용해서 UIFont를 사용할 수 있다.
[UIFont fontWithName:@"Verdana-BoldItalic" size:10.0f];
끝!
0 notes
koreandarren · 8 years
Text
[Swift] CGFloatMax in Swift
CGFloatMax / CGFLOAT_MAX는 Swift에서 어떻게 사용할까?
http://stackoverflow.com/a/26188012 에 잘 나와있다.
CGFloat.max 를 사용하면 된다.
How to use the CGFloatMax / CGFLOAT_MAX in Swift lang? The answer is here, http://stackoverflow.com/a/26188012.
You can use the CGFloat.max
0 notes
koreandarren · 8 years
Text
GIT-FAKER
You could be the best committer in the planet. 지구 최고의 커미터가 될 수 있습니다.
GitHub을 돌아다니다보면, 대단한 오픈소스 개발자들을 만나볼 수 있다. 엄청나게 많은 Star를 받은 repository를 관리하는 개발자, 혹은 그러한 repository에 contribute하는 개발자 등등..
내 기준에서 멋진 개발자는 자신의 repository의 star수가 얼마나 되었든, GitHub 프로필 페이지가 초록색으로 가득찬 개발자이다. 무언가를 엄청나게 꾸준히 했다는 뜻이니까..
그래서 결심!! 나도 초록개발자가 되어보자.
어떻게 초록 개발자가 되지?
꾸준히 프로젝트를 공개적으로 개발하면 된다. (1년 넘게..) 즉, 일일 커밋을 하면 되는데, 이게 여간 힘든게 아니더라..
개발자의 최고 장점은 자신이 원하는걸 뚝딱뚝딱 만들어낼 수 있다는 점.
한순간에 초록초록 개발자가 되어보기로 결심을 했다.
잔머리를 굴려보자.
가짜 커밋을 마구마구 만들어서 초록초록해 보이도록 해보자. 기존 커밋의 날짜를 바꿀까..도 생각해봤지만 그건 잘 진행되고있는 프로젝트를 망쳐버리는 무.리.수! 컴퓨터의 날짜를 바꿔가며 커밋하는것도 무리수..
git commit with time 이라고 구글신님께 여쭤보면, 어떤 명령어를 통해 커밋을 할 때 날짜를 설정할 수 있는지 잘 설명되어있는 Stack overflow 답변을 주신다. (질문자는 아마 하루종일 놀았다는걸 Boss에게 걸리지 않기 위해 그런 질문을 하지 않았을까 하는..)
$ GIT_AUTHOR_DATE='your date' GIT_COMMITTER_DATE='your date' git commit -m 'new (old) files'
위의 명령어를 통해 가짜 날짜로 커밋할 수 있다고 여기 잘 나와있으니 확인해보자.
어떻게 손쉽게 가짜 커밋을 만들지?
엥? 내 특기가 완전 멘땅의 헤딩 아니냐?
몇 달 전, 아래의 짤방을 script로 만들어준 git-fire가 큰 인기를 끌었다.
Tumblr media
일단 할줄 아는게 없으니 git-fire를 Clone!
git-fire는 shell script로 작성되어있었다. 난 Shell Script를 작성해본적이 없는데?
구글신님을 믿어보고, 하나하나 소스코드를 수정해 보았다.
아래는 내가 Shell script를 작성하며 느낀 점들..
신세계다..
하지만 구리다.
a=b는 되지만 a = b 는 안된다.
array=( a b c d e) 는 되지만 array = (a b c d e)는 안되네..
근데 막상 해보니 재밌다.
현재 날짜를 가져오는것 조차 힘들었다. 작년의 연도를 가져오기 위해 구글신님께 검색해보았는데, 안되서!! 결국 현재 연도에서 -1 하는 방향으로 진행을 했다.
연/월/일을 어떻게 정해주지? 2월은 28일까지고.. 1월은 31일 까지고.. 4월은 30일 까진데..
장난으로 최대값이 31이니 모든 달의 커밋을 1일에서 31일까지!!! 라고 코드를 작성했는데..신기하게도 잘 돌아간다. 올ㅋ
시/분/초는 누가 결정하지?
개발자인 내가 결정할 순 없으니 컴퓨터에 맡기자!
여기서 리빙포인트! Shell Script에서 랜덤 숫자는 $RANDOM 를 통해 가져올 수 있다~^^
너무 시끄러워!
for문을 돌면서 Git add, commit을 하는 스크립트이다 보니, 깃 add, commit 할 때 너무 많은 알림 메시지들이 커맨드 라인을 차지했다..
자비로운 구글신님께 부탁을 해보자. 특정 명령어 뒤에 >/dev/null 을 붙이면 해당 명령어로 인해 발생하는 로그들은 /dev/null로 가버리면서 사라지게 된다고 한다.
마무리는?
이름을 뭘로 지을까 고민했는데, 초록초록하게 만들어주니 git-eco로 할까 했지만.. 너무 깃헙에 국한된 작명같아서, git-faker (깃-사기꾼) 으로 결정!
GitHub에 올렸다. 주변 지인들의 반응도 꽤 괜찮았다.
끝! 맺으며
BEFORE
Tumblr media
AFTER
Tumblr media
지금의 git-faker는 의미없는 텍스트 파일을 만들어서 의미없는 커밋을 만들어주고 있다.
덕분에, git-faker를 사용한 Git repository 언어 분포율을 GitHub에서 확인하면 아래와 같이 Groff라는 놈이 나타나버린다..ㅠㅠ
Tumblr media
다음 업데이트 때에는, 사용자가 직접 특정 언어를 선택하면 해당 언어에 맞는 파일을 만들어서 커밋해주도록 개선할 예정이다. 보다 나은 faker가 되기 위해..
1 note · View note
koreandarren · 9 years
Text
[iOS] 동적 ShortcutItem 생성
iPhone 6S/6S+부터 추가된 3D 터치를 활용한 기능 중 하나인 Shortcut Item을 사용해보자!
Shortcut이 뭐지?
중학교를 나왔다면 알아야 하는 단어이다. 단어 자체를 모른다면 네이버에 물어보자.
Shortcut은 아래 이미지가 보여주듯, 앱 아이콘을 강하게(Force) 눌러 (Touch) 앱의 특정 경로로 빠르게 들어가는 기능이다.
Tumblr media
이미지 출처 : http://www.pcworld.idg.com.au/review/apple/iphone-6s-plus/586076/
UIApplicationShortcutItem
Shortcut 기능은, 위의 이미지에서 보이듯, 여러줄의 Shourtcut Item들로 구성되어있다. 띠용!? 그렇다면 UIApplicationShortcutItem은 어떻게 만들까!?
애플의 UIApplicationShortcutItem Class Reference 문서를 확인해보자.
initWithType:localizedTitle:localizedSubtitle:icon:userInfo: 메서드를 사용하여 초기화시켜주면 된다.
type의 경우, `NSString` 형이며, Item 고유값정도로 생각하면 될 듯 하다. 나도 잘 모르겠다.
LocalizedType과 LocalizedSubtitle은 Shortcut에 보여지는 제목과 부제목이다. 역시 `NSString` 값.
userInfo는 딱! 보면 알듯이 NSDictioinary 값으로, 해당 액션을 제어할 때 필요한 값들을 넣으면 된다. NSNotification의 그것과 같다.
icon의 경우, UIApplicationShortcutIcon을 넣어줘야 하는데, UIApplicationShortcutItem을 생성하는 방법은 크게 두가지가 있다.
System Image 사용.
Custom Image 사용.
전자의 경우, iconWithType: 메서드를 사용해서 System에서 기본으로 제공하는 아이콘의 type (UIApplicationShortcutIconType) 값을 넣어주면 된다.
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation];
참고로, UIApplicationShortcutIconType은 NSInteger의 ENUM 값이며, 종류는 아래와 같다.
UIApplicationShortcutIconTypeCompose
UIApplicationShortcutIconTypePlay
UIApplicationShortcutIconTypePause
UIApplicationShortcutIconTypeAdd
UIApplicationShortcutIconTypeLocation
UIApplicationShortcutIconTypeSearch
UIApplicationShortcutIconTypeShare
후자의 경우, iconWithTemplateImageName: 메서드를 사용해서, Project에 추가된 이미지의 이름값을 넘겨주면 된다. (마치 UIImage의 imageNamed: 메서드를 사용하듯이)
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"ImageName"];
앱에 적용하기
모든 일이 그렇듯, UIApplicationShortcutItem만 생성한다고 바로 앱에 적용되지는 않는다. UIApplication의 `shortcutItems`에 UIApplicationShortcutItem이 담긴 NSArray값을 넣어주면 완성! 코드로는 아래와 같다.
[UIApplication sharedApplication].shortcutItems = @[item1, item2, item3, ...];
갖고놀기
이제 앱에 적용이 되었다! Shortcut item을 통해 앱에 들어왔을 경우, 어떻게 핸들링 해야할까?
두가지 경우를 대비해 줘야 한다.
앱이 Background에 켜져있는 상황에서 Shortcut Item을 통해 앱을 열었을 경우.
앱이 켜져있지 않은 상태에서 Shortcut Item을 통해 앱을 열었을 경우.
전자(삼성전자 아님ㅎ)의 경우, UIApplicationDelegate의 application:performActionForShortcutItem:completionHandler: 라는 메서드에서 Handling할 수 있다. Background상태의 앱을 Shortcut Item을 통해 열었을 경우, 위의 메서드가 실행되기 때문. UIApplicationShortcutItem을 바로 넘겨주기 때문에, 미리 지정한 userInfo 혹은 type 값을 이용해서 특정 액션을 취해주면 된다.
후자의 경우에도 역시 UIApplicationDelegate의 application:didFinishLaunchingWithOptions: 메서드에서 핸들링할 수 있는데, 전자와는 달리, 바로 UIApplicationShortcutItem을 넘겨주지 않는다. UIApplicationShortcutItem은 launchOptions의 UIApplicationLaunchOptionsShortcutItemKey 값으로 가져와야 한다. 아래의 코드처럼.
UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];
어때요, 참 쉽죠!?
주의하긔
ShortcutItem은 iOS9부터 추가된 기능이다. iOS9 미만 버전을 지원한다면, 꼭 분기처리를 하자. 단순히 UIApplicationShortcutItem을 호출하는것만으로도 앱이 죽어버린다.
참고자료
Adopting 3D Touch on iPhone
1 note · View note
koreandarren · 9 years
Text
[Objective-C] How to search object in NSArray
NSArray에 Person이라는 class의 오브젝트들이 담겨있다고 해보자. 이들 중, name이라는 property의 값이 darren인 object는 어떻게 찾을까?
For문을 이용해 찾아보자.
NSMutableArray *result = [NSMutableArray new]; for (Person *personObject in array) {     if ([personObject.name isEqualToString:@”darren”]) {         [result addObject:personObject];     } }
이런 더러운 코드는 정말 어쩔 수 없을 때가 아니라면 사용하지 말자. 가끔 Stackoverflow의 고수들도 이런 실수를 하기도 한다.
NSPredicate를 이용해 찾아보자.
Cocoa의 Foundation framework에는 NSPredicate라는 멋진 클래스가 존재한다. 그리고, NSArray에는 predicate를 이용하여 필터처리를 해주는 멋진filteredArrayUsingPredicate: 메소드도 존재한다.
NSPredicate를 위의 더러운 7줄 짜리 코드를 아래와 같이 2줄로 줄일 수 있다.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", arron-shin"darren"]; NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
끝! 맺으며
참고 자료
Stack overflow: NSArray find object or objects - best practices
Stack overflow: Search NSArray for value matching value
0 notes
koreandarren · 9 years
Text
[iOS] Reachability in AFNetworking
AFNetworking 은 iOS (뿐만 아니라 모든 Cocoa framework) 개발자들이 인정하는 최고의 오픈소스 라이브러리다. 네트워크 관련되어서는 Apple 보다 잘만들었다.. 게다가 오픈소스!
이런 AFNetworking에는 숨겨진(이라기보다는 사람들이 잘 모르는) 기능들이 몇가지 있다. 그것들 중, 요즘 애용하고있는것은 Reachability 기능이다.
Reachability의 뜻은 네이버 사전에 검색해보자.
현재, iOS 기기가 인터넷에 연결 되어있는지 (네트워크 사용 가능 상태인지), 만약 그렇다면 와이파이인지 3G인지 친절히 알려준다. (애플에서 만든 Reachablity Library도 있다.)
사용법은 아주 간단하다. 가장 먼저, 아래의 코드를 통해 모니터링을 시작한다.
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
* 자매품 stopMonitoring도 잊지 말자!
자, 이제 Reachability가 모니터링을 시작했다.
현재, iOS 단말의 Reachable 여부는 어떻게 알까? 
AFNetworkReachabilityManager 클래스의 reachable property가 네트워크 사용 가능 여부를 알려준다.
[AFNetworkReachabilityManager sharedManager].isReachable;
AFNetworkReachabilityManager.h 를 들어가보면 해당 property의 상세 정보를 볼 수 있다 우왕!! 설명도 자세히 나와있어!!!.
@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable;
* 자매품 reachableViaWWAN 과 reachableViaWiFi 도 잊지 말자.
Reachablity 상태가 변하는걸 어떻게 캐치하지?
AFNetworking의 큰 장점 중 하나는 Block을 지원한다는 점인데, 개인적으로 위에서 언급한 Apple의 Reachability를 사용하지 않고, AFNetworkReachabilityManager를 사용하는 가장 큰 이유이다.
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {        if (status == AFNetworkReachabilityStatusNotReachable) {            NSLog(@"Not reachable");        } else if (status == AFNetworkReachabilityStatusReachableViaWiFi) {            NSLog(@"Reachable via WiFi");        } else if (status == AFNetworkReachabilityStatusReachableViaWWAN) {            NSLog(@"Reachable via WWAN");        } else {            NSLog(@"Unknown :(");        }    }];
위의 코드와 같은 형식으로 사용된다. 별도의 Notification이나 Delegate를 사용하여 지저분한 코딩을 할 필요가 없다. Reachability가 바뀔 때마다 해당 블럭이 실행되고, status를 준다.
status는 NSInteger value의 enum이고, AFNetworkReachabilityManager.h 파일에 선언되어있다.
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {    AFNetworkReachabilityStatusUnknown          = -1,    AFNetworkReachabilityStatusNotReachable     = 0,    AFNetworkReachabilityStatusReachableViaWWAN = 1,    AFNetworkReachabilityStatusReachableViaWiFi = 2, };
끝!맺으며
AFNetworking을 사용하지 않는다면, 위에서 언급한 Apple의 Reachability 혹은 tonymillion이라는 개발자의 Reachability를 사용하자. 아쉽게도 후자의 경우에는 아래와 같은 메시지가 붙어있다. 
"WARNING there have been reports of apps being rejected when Reachability is used in a framework. The only solution to this so far is to rename the class."
참고로 며칠 전, AFNetworking의 Reachability를 사용하는 프로젝트가 앱스토어에 잘 등록되었다.
AFNetworking은 항상 업데이트된다. AFNetworking의 공식 문서에서도 Reachability Manager에 대해 잘 설명하고 있으니, 읽어보도록 하자.
이 포스트는 AFNetworking 2.5.4 버전을 기준으로 작성되었다.
참고 웹페이지
Stack overflow: AFNetworking 2.0 Reachability
Git hub: AFNetworking/AFNetworking
Git hub: tonymillion/Reachability
Apple iOS Developer Library: Reachability
0 notes
koreandarren · 9 years
Text
[iOS] NSMutableDictionary is kind of class: NSDictionary
NSMutableDictionary는 NSDictionary의 subclass이다. (사실 반대인줄..ㅎ)
따라서, isKindOfClass:[NSDictionary class]를 해보면 YES값이 나온다.
isKindOfClass:부모클래스 = YES (어쩌면 너무나 당연한..)
따라서, 아래의 코드를 실행해보면
   NSMutableDictionary *mutableDictionary = [NSMutableDictionary new];    NSDictionary *dictionary = [NSDictionary new];
   NSLog(@"Mutable Dictionary is Kind Of Class Dictionary : %d", [mutableDictionary isKindOfClass:[NSDictionary class]]);    NSLog(@"Dictionary is Kind Of Class Mutable Dictionary : %d", [dictionary isKindOfClass:[NSMutableDictionary class]]);
아래와 같은 로그가 찍힌다.
Mutable Dictionary is Kind Of Class Dictionary : 1 Dictionary is Kind Of Class Mutable Dictionary : 0
0 notes
koreandarren · 9 years
Text
[Git] How to rename branch
branch 이름을 잘못 짓는 멍청한 짓을 하는 사람들이 종종 있다. (사실 그게 나다.)
나의 경우에는, 기존 Repo를 Fork 뜬 Repo에 git flow를 사용하려고 하니까, 이미 develop branch가 존재하는 바람에.. 이놈을 다른 이름으로 바꾸기 위해 branch를 rename하는 방법을 알아보았다.
Git의 명령어 자체는 늘 그렇듯 정말 간단하다. 아래의 명령어만 입력해주면 된다.
git branch 기존_이름 새_이름
만약, 현재 브랜치의 이름을 바꾸고 싶다면 더 간단하다.
git branch -m 새_이름
참고 : http://stackoverflow.com/a/6591218/4356845
끝.
0 notes
koreandarren · 9 years
Text
[iOS] Get the title of UIButton
UIButton에는 titleLabel이라는 UILabel property가 있다. UIButton에 설정한 Title String은, button.titleLabe.text로 가져오면 되는줄 알았는데, 아무리 호출해보아도 값이 안온다..
생각해보니 UIButton에서 title을 설정할 때, State별로 설정을 할 수 있는데, title을 가져올 때에도 State별로 가져와야 한다.. (사실 당연한건데..)
해답은 UIKit의 UIButton.h 파일��� 정독해보면 나온다.
- (NSString *)titleForState:(UIControlState)state;          // these getters only take a single state value
위의 메서드를 아래와 같이 호출하면 된다.
NSString *theRealTitle = [myButton titleForState:UIControlStateNormal]; // Get the title of myButton for normal state
Title 뿐만 아니라, Title Color, Title Shadow Color, Image, Background Image, Attributed Title도 위와 같은 방식으로 호출하면 된다. 해당 메소드들은 아래에 있다. (UIKit/UIButton.h)
- (NSString *)titleForState:(UIControlState)state;          // these getters only take a single state value - (UIColor *)titleColorForState:(UIControlState)state; - (UIColor *)titleShadowColorForState:(UIControlState)state; - (UIImage *)imageForState:(UIControlState)state; - (UIImage *)backgroundImageForState:(UIControlState)state; - (NSAttributedString *)attributedTitleForState:(UIControlState)state NS_AVAILABLE_IOS(6_0);
1 note · View note
koreandarren · 9 years
Text
[iOS] Button의 Image에 tintColor를 적용하는법
UIButton의 이미지에 tintColor를 설정하면, 이미지가 자동으로 마스킹(?) 돼서, 뿅! 하고 나타날줄 알았는데, 역시 아니었다.
방법은 의외로 간단했는데, 설정할 이미지를 불러올 때, renderingOption을 주면 된다. 코드로 보자면 아래와 같다.
[[UIImage imageNamed:@"ImageName"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Xcode에서 cmd를 누르고 들어가보면 알겠지만, 해당 메서드는 iOS7 이상부터 가능하다.
renderingMode는 이름에서부터 티가 나지만, enum값을 받는다.
자세한건 UIKit/UIImage.h 혹은 애플의 문서를 참고하자.
UIKit/UIImage.h
// Create a version of this image with the specified rendering mode. By default, images have a rendering mode of UIImageRenderingModeAutomatic. - (UIImage *)imageWithRenderingMode:(UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0); @property(nonatomic, readonly) UIImageRenderingMode renderingMode NS_AVAILABLE_IOS(7_0);
typedef NS_ENUM(NSInteger, UIImageRenderingMode) { UIImageRenderingModeAutomatic, // Use the default rendering mode for the context where the image is used UIImageRenderingModeAlwaysTemplate, // Always draw the image as a template image, ignoring its color information } NS_ENUM_AVAILABLE_IOS(7_0); UIImageRenderingModeAlwaysOriginal, // Always draw the original image, without treating it as a template
관련 Stack overflow : Color Tint UIButton Image
0 notes
koreandarren · 9 years
Text
[Xcode] When the 'Running Custom Shell Scripts' makes your project slow to build.
며칠 전부터, Xcode로 프로젝트를 실행할 때 마다, 아래의 그림과 같이 Running Custom Shell Scripts 부분에서 속도가 굉장히 느려졌다... 1분 안팎..
Tumblr media
참고 사용하려 했지만, Layout 작업때문에 빌드를 자주 해야했는데, 그때마다 시간이 너무 오래걸려서 참을수가 없었다.
Cocoapods가 설치되면서 생성된 스크립트의 문제였다.
해결법은 아래와 같다.
Build Phases-> Target에서 메인 프로젝트를 선택한다.
Check Pods Manifest.lock 와 Copy Pods Resources 을 연다.
Run script only when installing 체크박스를 체크한다.
따로 스크립트를 작성할 필요도 없고, 두개의 체크만 해주면 된다.
아래와 같은 결과가 나와야 한다.
Tumblr media
참고자료
xcode custom shell scripts slowing down compile time http://stackoverflow.com/a/21318086/4356845
0 notes
koreandarren · 9 years
Link
갓태경님이 git과 git flow에서 자주 사용하는 명령어를 정리해주셨다.
오늘도 잠들기 전에 절하고 자야겠다..
4 notes · View notes
koreandarren · 9 years
Text
[iOS] How to set the Text-Inset of UITextField?
개발을 하다 보면, UITextField의 텍스트 부분 Inset을 설정해야할 때가 있다.
스택오버플로우의 답변을 보면 참 쉽게 할 수 있다.
1. UITextField의 subclass를 만든다.
2. textRectForBounds: 와 editingRectForBounds: 메서드에서 원하는 CGRect 값을 반환하면 된다.
참 쉽다 >_<
2015년 1월 30일 수정
textRectForBounds:는 placeholder의 inset을, editingRectForBounds: 에서는 사용자가 입력하는 텍스트 (.text)의 inset을 return해주면 된다.
0 notes
koreandarren · 9 years
Text
[Server] 서버 이전
이전 포스트 (다시 보니 굉장히 민망하다) 에서도 적었듯, 중학생때 사용하던 싸구려 데스크탑에 CentOS를 설치해서 서버를 돌리고 있었다.. 대단한 프로그램을 돌리는것도 아니고, 동접자가 몇십명도 채 되지 않는 서버라 사양은 구려도 돌릴만 했다.
하지만 굉장한 문제가 있었는데, 소음이 더럽게 컸다.. 이 서버 설치하고 며칠동안 잠을 제대로 잘 수 없을정도로.. 요즘은 익숙해지긴 했지만 깊은 잠에 들 수는 없다ㅠㅠㅠㅠ은ㅁ라ㅣ넒ㄷ자ㅣ;럼ㄷ
서버 컴퓨터를 집에 옷방으로 옮기려 했지만, 옷방에 놓여진 큰 장롱이 콘센트를 가려놔서 전원 공급을 할 수 없었다.. 길다란 랜선도 없고...
결국 내가 옷방에서 자기로 했는데, 삼일정도 자다보니까 사람이 할 짓이 안되더라.. 그리고 뭔가 컴퓨터에게 진 기분이 들어서 화가 났다... 은라먼일;ㅏㅓㅁㄴㅇㄹ
꾸역꾸역 버티다가, 회사 다니느라 집에서 잘 사용하지 않는 맥미니를 서버로 돌리기로 마음을 먹었다.. 부들부들...
1. 맥에는 기본적으로 아파치와 PHP가 설치되어있다고 한다.
이것저것 삽질하다가 내가 마음에 들 정도의 깔끔함(?)이 없어서.. 결국....
2. OS X Server를 설치했다.
이거 물건이다.. 그냥 대충대충 웹서버 켜고 localhost들어가면 웹사이트가 뜬다..!! Xcode나 이메일, 캘린더 등등도 공유할 수 있는거같은데 다음에 자세히 알아봐야겠다..
3. My SQL을 설치했다.
그냥 mysql 공식 홈페이지에 들어가면 맥용 mysql을 설치할 수 있다.
4. 서버에 있는 데이터들을 백업 후 옮겼다.
DB도 백업해서 적용하고, 기타 데이터들도 백업한 후 맥미니로 옮겼다.
5. node.js를 설치했다.
이 또한 자세한 설명은 생략... 그냥 nodejs.org 들어가서 다운받으면 된다.. 글로벌 옵션으로 express랑 몇몇 필수 모듈들 설치해주니 끝!
6. 도메인 설정
은 내일..해야겠다 ㅎ
그냥 하는김에 다 해버렸다.
기존 아파치의 http.conf의 내용을 Mac OS X Server config 파일로 옮겨야 하는데, config 파일이 어딨는지 찾을수가 없었다..
대충 이것저것 찔러보니 /Library/Server/Web/Config/apache2/sites 라는 폴더에 여러가지 config 파일들이 나눠져 들어가있었다. virtual_host_global.conf 라는 파일에 꾸역꾸역 넣어줬더니 잘 작동한다.
7. OS X Server는 원래 유룐데, 몇년 전 WWDC 이후에 (아마 2013년 iOS7 발표 이후..) 개발자들에게 무료로 풀렸다. 앞에서도 언급했듯, 정말 간단하고 심플하지만 대단한 기능을 하는 물건이다.
FTP랑 SSH도 클릭 몇번으로 한번에 해결해준다. 조금 더 공부해서 어떤 기능들을 더 사용할 수 있는지 알아봐야겠다.
끝!
참고한 링크들
NPM throws error without sudo
NPM global install cannot find module (다른건 다 필요없고 제일 아랫줄의 export로 시작하는 코드를 글로벌 node_modules directory path로 설정해주면 된다.)
Get Apache, MySQL, PHP and phpMyAdmin working on OSX 10.9 Mavericks
0 notes
koreandarren · 9 years
Text
[iOS] viewDidLoad Issue
분명히 이전, iOS7까지만 해도 UIViewController의 viewDidLoad 메서드에서 self.view.frame.size.height를 로그로 확인해보았을 때, 4인치 화면, opaque navigation bar을 기준으로 568(height of display) - 44(height of navigation bar) - 20(height of status bar)라는 식에 의하여 504가 나왔다..
iOS8부터 바뀐것인지 이번 프로젝트를 진행하면서 Storyboard의 기본 사이즈를 Xcode 6부터 권장하는 정사각형(600*600)으로 놓고 작업해서 그런지.. 그냥 568 (height of display) 값이 찍힌다.. (자세한 원인은 나중에 시간날 때 여러가지 테스트를 해서 확인해 봐야겠다... 분명, 지난 돈갚아 프로젝트를 할 때에는 안그랬던거 같은데...)
이거때메 계속 삽질을 했다...
혹시나해서, viewDidLayoutSubviews 메서드에서 로그를 찍어보니 504로 제대로 찍힌다.. 아마 Auto/Adaptive Layout때문에 그런 듯 하다.
20151203 업데이트
storyboard/xib를 사용하면 viewDidLoad에서는 정말 `view가 로드된 직후`이기 때문에, 스토리보드에서 정한 size로 반환이 된다. view가 layout 된 이후에.. 즉, viewDidLayoutSubviews에서, 정확한 사이즈가 나오게 된다.
1 note · View note