2013 이전/iOS개발

[iOS 개발] NSArray 역순으로 변환

hagulu 하구루2017. 2. 25. 16:16

NSArray의 Value들을 역순으로 정렬할때 다음과 같이 하면된다.

 
[[array reverseObjectEnumerator] allObjects]
reverseObjectEnumerator 라는 메소드를 통해서 역순이 된 array의 NSEnumerator 객체를 얻게 되고
여기서 부터 allObjects를 통해서 해당 array를 얻게 된다.


댓글

댓글쓰기 폼

2013 이전/기타

iOS6의 화려한 변신은 국내 사용자에겐 그림의 떡(?)

hagulu 하구루2017. 2. 25. 16:15

 한국시간 9월 20일 iOS6가 정식 출시 되었다.
그에 맞추어 전에 썼던 글을 수정해 보았다.
베타 때와 달라진점과 그래도 여전히 부족한 점에 대해 중점적으로 소개해 보겠다.


이번 iOS6에서 중점적인 부분은 구글 맵을 버리고 새롭게 도입한 맵과 좀 더 다양한 기능이 추가된 시리 이다.

먼저 맵, 발표할때만 보더라도 우와~ 우와~ 하면서 보았다. 3D형식의 일반 맵과 FlyOver라는 심시티 스러운 뷰들이 놀라울 다름이었다. 더군다나 tomtom의 네비게이션 기능까지 추가되어 화려하고 완벽한 지도앱으로 탈바꿈 되었다.


베타 때보다는 생각 보다는 많은 것이 지원되었다. 일단 독도! 가 제대로 표현이 되었고, 턴바이턴 네이게이션이 국내에서 동작을하고, 도로명과 상호가 한글화 되었다.

 하지만, 아직도 세세한 골목길같은 길이 표시가 미흡하고, 특히 지방의 경우는 그 정도가 심각하다. 그리고 건물들의 표시가 전혀 되어 있지 않아서 보기에 불편하다. flyover 기능은 전보다 더 악화 되었다. 확대비율이 현저하게 줄어서 위성 지도는 사용하기 조차 힘들어 졌다. 또한, 턴바이턴 네비게이션은 간결하기는 하지만 국내 네비게이션 앱에 길들여진 사용자들에게는 불편하게 다가올 것이다.

앞으로 지도가 좀더 상세하게 되길 바랄 뿐이다.


        







이덕에 다음맵과 네이버 맵의 사용률이 좀더 많이 높아질 것으로 보인다.
기본 맵을 사용하는 앱들은 머리가 아파질 문제이다.


 다음은 시리,
 드디어 고대하던 한국어 지원이 들어 왔다. 내가 밤잠을 설쳐가면서 이번 WWDC를 지켜 본 이유도 이 기능에 대한 기대 때문이었다. 게다가 시리는 업데이트 되어서 좀더 많은 정보를 시리를 통해서 얻을 수 있게 되었다. 스포츠 스코어를 확인한다던가, 선수의 정보를 찾고 비교 한다던지, 영화 시간표, 영화 정보, 예매등을 시리로 손쉽게 확인 할수 있게 되었다. 또한 yelp를 통해서 레스토랑 정보를 얻고 예약 까지 가능하다고 한다. 위에 설명한 새로운 맵의 네비게이션 기능 또한 시리로 이용 가능하다. 참으로 반가운 소식이 아닐수 없었다.





 하지만!
 이 역시 시리의 기능은 제한적 일수 밖에 없다. 이번에 새롭게 지원되는 기능들이 모두 미국의 중심으로 이루어진 내용들이다. 국내에서는 사용할 수 없는 정보들이다. 기대를 많이 한것인지 생각보다 말을 못 알아 듣고, 억양에 따른 질문과 명령을 구분하지 못하는것으로 보였다. 베타때 보다는 좀더 나아진 것을 보였지만, 그래도 아직 인식의 문제가 심하다. 특히, 시리는 음성을 곧이 곧대로 변환하는게 아니고, 명령과 유사한 발음일경우 그 명령으로 교체하여 해석한다. 즉 인식률을 높이기위한 방법인데, 한국어의 경우 아직 제대로 자리잡지를 못한 상황이라 도리어 이때문에 인식률이 더 떨어진다. 시리가 인공지능으로 계속 발전한다고 하니 많이 사용해서 인식률이 빨리 높아 졌으면 하는 바람이다.


 다음으로 passbook 이라는 전자 지갑 앱이 새로 생겼는다. 베타 때만 해도 이 서비스가 국내에 사용이 될까 했지만, 최근 http://mypassbook.co.kr 이라는 사이트가 생겨서 이 앱을 이용한 서비스를 준비 중이다. 거래처를 모집하고, 안드로이드도 사용할수 있도록 준비 단계인 것 같은데, 외면 받지 않고 활성화 되었으면 하는 바램이다.






 그외에 페이스타임이 와이파이 이외에서도 통화가 가능하도록 변경되었지만, 현재 국내 통신사들이 3G/4G를 이용한 통화에 매우 소극적이어서 제대로 이용될수 있을지는 의문이다.
 베타 때에 비해서 조금 나아 지긴 했지만 이번 iOS6는 특히 미국 위주의 업데이트가 많은것 같아서 안타까울 따름이다.


댓글

댓글쓰기 폼

2013 이전/기타

[클라우드 서비스] 클라우드 서비스별 장단점

hagulu 하구루2017. 2. 25. 16:09

오늘부로 소문만 무성했던 google Drive 서비스가 미국을 시작으로 본격적으로 시작되었다.

한국에 정식 서비스는 5월 3일 부터 시작된다고 한다.
덕분에 지금 https://drive.google.com/start 를 들어가면 404 Not Found 에러가 보여진다.
단, 방법이 있는데
google 계정으로 로그인 후에 언어를 영어로 설정해주면 페이지가 보여진다.
그랫더니 "Your Google Drive is not ready yet" 라는 메시지가 나와서 조용히 기다리는중....
내가 요녀석을 목빠지게 기다리는 이유는... 은근히~ 딱 맘에 드는 클라우드 서비스가 없다..
그래서 간단히 클라우드 서비스의 장단점을 다분히 주관적으로 정리해보려고 한다.

Drop box
세계적으로 가장 많은 사용자를 가지고 있는 클라우드 서비스 이다.
장점 - Mac OS, windows 클라이언트가 일반 디렉토리와 싱크가되어 사용이 편리하다.
현재 써본 iPad 앱중 직관성이 가장 뛰어나다.
iPad 앱 사용시에 다른 앱과 연동이 되어서 활용도가 높다.
단정 - 기본 무료 제공 용량이 2기가 밖에 되지 않는다.
한국에서 속도가 너무 느리다.

Sky Drive
MS 에서 만든 차세대 Windows 를 겨냥한 클라우드 서비스
장점 - Mac OS, windows 클라이언트가 일반 디렉토리와 싱크가되어 사용이 편리하다.
iPad 앱 사용시에 다른 앱과 연동이 되어서 활용도가 높다.
단정 - 최근 25GB에서 7GB로 기본 용량을 줄였다.
한국에서 속도가 너무 느리다.
UCloud
KT 에서 서비스하는 클라우드 서비스
장점 - KT 이용자는 50GB라는 큰용량을 제공해준다.
전송 속도가 빠르다.
단점 - PC용 클라이언트 사용이 불편하다.
로그인등 접속이 원할하지 못한경우가 있다.
iPad 앱에 다른 앱과 연동이 되지 않는다.

Daum Cloud

daum 에서 서비스하는 클라우드 서비스
장점 - Mac OS, windows 클라이언트가 일반 디렉토리와 싱크가되어 사용이 편리하다.
전송 속도가 빠르다
50GB라는 대용량을 무료 제공한다.
단점 - iPad 앱이 없다
iPhone 앱이 있지만 다른 앱과 연동이 되지 않는다.

N드라이브
Naver 에서 서비스하는 클라우드 서비스
장점 - 속도가 빠르다
30GB라는 대용량을 제공한다.
단점  - PC 클라이언트가 불편하다.
iPad 앱에 다른 앱과 연동이 되지 않는다.


주절 주절 몇가지를 정리해 보았는데,
외국 서비스는 플랫폼에 잘대응하고 사용이 편리한대신에, 외국 서비스라 전송속도가 느리고, 용량이 적다.
국내 서비스는 용량이 크고 속도가 빠른 대신에, 여러 플랫폼에 대응이 미흡한 점이 있다.
결론은 용량 크고 속도 빠르고 여러 플랫폼에 대응 하는 서비스가 필요하다 ㅠㅠ
그래서 구글에 용량이 좀 부족하더라도 기대를 걸어 보고 있는 상황이다.
정식적으로 한국에 서비스가 진행된다고 하니 속도도 어느정도 기대해 볼만하기 때문이다.
구글 특성상 플랫폼 지원도 깔끔하지 않을까 예상해 본다.
- 추가
구글이 최근 새로운 사용자 약관이 추가 되었는데 (아래 인용 참고)
그에 따르면, 사용자가 올린 컨텐츠에대한 권리를 구글또한 가지게 된다.
서비스의 질을 높이기위한 것이라고는 한데, 이런 방식을 처음 접한 사용자는 흠짓 놀랄만한 내용이다.
과연.. 어떻게 흘러갈지 궁금한 대목이다.
When you upload or otherwise submit content to our Services, you give Google (and those we work with) a worldwide licence to use, host, store, reproduce, modify, create derivative works (such as those resulting from translations, adaptations or other changes that we make so that your content works better with our Services), communicate, publish, publicly perform, publicly display and distribute such content. The rights that you grant in this licence are for the limited purpose of operating, promoting and improving our Services, and to develop new ones. This licence continues even if you stop using our Services (for example, for a business listing that you have added to Google Maps).(이번에 새롭게 만들어진 약관)


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] string 이 URL 형식인지 확인하기

hagulu 하구루2017. 2. 25. 16:08

어떤 string이 url인지 판별하는 방법은 여러가지가 있다.

 
하지만 대부분 http 와 같은 프로토콜을 꼭 포함 시켜야 하거나,
"adf.asdf.asdf" 등의 실제로 사용가능한 주소 형식이 아니더라도 주소로 판별되는 경우가 있다.
그래서 좀더 정확성 높은 방법을 찾다가
정규 표현식을 통한 방법 중에 괜찮은 방법을 찾앗고,  
여기에도 문제점이 있어서 수정해서 아래와 같이 사용해 보았다.

NSString *ptn = @"(((http|https)://)?([0-9a-z_-]+\\.)+(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|
ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|
cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|
gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|
jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mn|mn|mo|
mp|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|nom|pa|pe|pf|pg|ph|pk|pl|pm|pn|
pr|ps|pt|pw|py|qa|re|ra|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|
tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw|arpa)
($|((:[0-9]+)?((\\/([~0-9a-zA-Z\\#\\+\\%@\\.\\/_-]+))?(\\?[0-9a-zA-Z\\+\\%@\\/&\\[\\];=_-]+)?)?)))";
    
NSRange range = [aStr rangeOfString:ptn options:NSRegularExpressionSearch];

위 정규 표현식의 중점은 .com .net 과 같은 정의되어 있는 것들만 포함이 되는것을 찾는것이다.
 보기 좋게 하기 위해 개행을 하였습니다. 사용할때는 개행을 제거하고 이용하시기 바랍니다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] AudioSessionAddPropertyListener 의 해제

hagulu 하구루2017. 2. 25. 16:08

audio session 을 사용하다보면


AudioSessionAddPropertyListener 를 통해서  리스너를 등록해서 사용하게 되는데,

이 리스너는 해제해주지 않으면 계속 해당 프로퍼티에 대해서 리스너를 유지하고 있다.

리스너를 등록한 객체가 release 되더라도, 리스너는 해제되지 않는다. 


명시적으로 해지를 해주어야 하는데



AudioSessionRemovePropertyListenerWithUserData

위 함수를 통해서 해제를 해주어야 한다.


AudioSessionAddPropertyListener 은 계속 추가되는 방식이기 때문에 콜백 함수대신에 NULL을 넣는 등의 방식으로는 해제가 되지 않고 위에 소개된 메소드를 통해서만 해지가 가능하다. 


사용법은 AudioSessionAddPropertyListener 와 모두 같은 파라미터를 넣어주면 된다.

AudioSessionAddPropertyListener를 사용할 수 있다면 쉽게 사용할 수 있을 것이다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] sqlite query 따옴표 처리

hagulu 하구루2017. 2. 25. 16:08

sqlite 를 이용해서 쿼리를 사용하다 보면 쿼리에서 스트링을 넣을때


SELECT TEST FROM TEST_TABLE WHERE TEST = 'string'

와 같이 따옴표 안에 string을 넣게 된다.

그런데 스트링에 따옴표를 추가하고 싶으면 어떻해야 할까?

당연히 \' 라고 생각을해서 스트링을 변환을 했더니 되지 않았다.

db를 잘 아시는 분들에게는 쉬운 답이겠지만, 찾아 보니 따옴표를 두개를 넣어 줘야 한다.

즉 'string' 이라는 string을 입력하고 싶으면


SELECT TEST FROM TEST_TABLE WHERE TEST = '''string'''

와 같이 처리해 주어야 한다.

 '''string'''

쌍따옴표가 아니라 모두 홑따옴표 입니다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] audiosession category 의 비밀

hagulu 하구루2017. 2. 25. 16:07

사운드를 나오게 하는 앱을 개발하다 보면

여러 sound와 관련된 문제에 봉착하게 되는데
여기에는 audiosession이 가지고있는  category에 기인하는 경우가 많다.

여기서 먼저 다루어볼 부분은 route 부분이다.
현재 iphone audiosession 에는
다음과 같은 category가 있다.
AVAudioSessionCategoryAmbient;
AVAudioSessionCategorySoloAmbient;
AVAudioSessionCategoryPlayback;
AVAudioSessionCategoryRecord;
AVAudioSessionCategoryPlayAndRecord;
AVAudioSessionCategoryAudioProcessing;
각각에 대한 좀더 구체적인 설명은 아래 링크를 참조 하기 바란다.
위에 링크에 나와 있는 특성에 따라 output route의 처리도 달라지는데 이 정의를 제대로 알지 못해서 고생을 했었다.
위 category중에서 output이 가능한것은
AVAudioSessionCategoryAmbient;
AVAudioSessionCategorySoloAmbient;
AVAudioSessionCategoryPlayback;
AVAudioSessionCategoryPlayAndRecord;
위 네가지 이다.
이때 소리가 기본적으로 speaker 로 소리가 나는것은
AVAudioSessionCategoryAmbient;
AVAudioSessionCategorySoloAmbient;
AVAudioSessionCategoryPlayback;
이고,
기본적으로 ear speaker를 통해서 소리가 나오는것은

AVAudioSessionCategoryPlayAndRecord;

이다.
ear speaker를 통해 음원을 재생해야 한다면 위 세가지를 통해서는 불가능하다 (내가 찾아본 범위 안에서)
일반적으로 음원이 재생되는 route를 변경하기 위해서는

        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

와 같은 방식으로 변경을 하게 되는데

kAudioSessionProperty_OverrideAudioRoute 에 set할수 있는 값은

kAudioSessionOverrideAudioRoute_None - 기본 재생 route

kAudioSessionOverrideAudioRoute_Speaker - speaker 
요 두가지 뿐이다.
그렇기 때문에 기본 재생이 speaker 인 위의 세가지를 통해서는 위 방법을 통해서 route를 바꿀수 있는 방법은 없다.
즉, voip와 같은 ear speaker 를 통해 기본적으로 소리가 나야 하는  앱을 만들기 위해서는  AVAudioSessionCategoryPlayAndRecord 를 꼭 이용해야 한다.


너무 당연한 답을 길게 쓴게 아닌가 갑자기 민망해 지려고 한다;;; ;


나 같이 헤매고 있는 어떠한 분에게 도움이 되었으면 한다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] keyboard 애니메이션 정보 얻기

hagulu 하구루2017. 2. 25. 16:06

키보드에 붙어 다니는 뷰를 만들다 보니 keyboard 가 가지고 있는 애니메이션과 동일하게 해당뷰의 애니메이션을 지정해주어야 한다.

예전 iOS4 까지는

[UIView setAnimationDuration:0.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
위와 같은 애니메이션을 주면 키보드와 혼연일체로 움직인다.

하지만 iOS5 로 업데이트 되면서 keyboard 가 빨라 졌다.

테스트를 통해서 확인해 본결과 duration이 0.26으로 줄어 들었다.

게다가 iOS5에는 일본어 키보드에 힌트를 위한 뷰가 키보드위에 생겨났다.

이에 관한 것은 http://hagulu.com/129 포스트를 참고 하길 바란다.

일본어 키보드 때문에 대응해야하는 애니메이션이 있는데,

기존에 다른 언어 키보드가 있을때 일본어 키보드로 변경될때는  애니메이션이 없이 움직인다.

따라서 키보드 위에 붙어 다니는 뷰에서 애니메이션이 없어야 한다.

일본어 키보드가 뜨면 키보드 위에 붙어있는 뷰가 애니메이션이 적용되어 부자연스럽게 보여진다.

이렇게 iOS4 이전과 iOS5 이후를 if문 없이 대응 할수 있는 방법을 설명하려고 한다.

위에 소개된 포스트에서 이용하던 것과 비슷한 방법이다.

먼저 아래에 두개의 notification을 설정해 준다.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

해당 notification은 보시는 봐와 같이 키보드가 나타나거나 사라지려 할때 나타나는 notification 이다.

이때에 notification 이 가지고 있는 정보를 통해서 간단하게 해당 키보드의 애니메이션 정보를 가져올수 있다.

- (void)keyboardWillShow:(NSNotification *)notification {
    NSLog(@"keyboard will show");
   
    NSTimeInterval keyboardAnimationDuration;
    UIViewAnimationCurve keyBroadAnimationNumber;

    NSValue* value = [notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    [value getValue:&keyboardAnimationDuration];
    
    value = [notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];
    [value getValue:&keyBroadAnimationNumber];
    
}

- (void)keyboardWillHide:(NSNotification *)notification {
    NSLog(@"keyboard will hide");
   
    NSTimeInterval keyboardAnimationDuration;
    UIViewAnimationCurve keyBroadAnimationNumber;

    NSValue* value = [notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    [value getValue:&keyboardAnimationDuration];
    
    value = [notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];
    [value getValue:&keyBroadAnimationNumber];
}
위와 같이 UIKeyboardAnimationDurationUserInfoKey와 UIKeyboardAnimationCurveUserInfoKey를 통해서 애니메이션 시간과 애니메이션 curve 정보를 얻어 올수 있고 이를 통해서 키보드가 나타날때와 사라질때 뷰를 관리해주면 키보드와 혼연일체로 움직이는것을 확인해 볼수 있을것이다.
 


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] mov 파일 mp4로 변환하기

hagulu 하구루2017. 2. 25. 16:06

안드로이드와 호환이 되는 파일 전송을 구현하다 보니 동영상 전송에 문제가 발생했다.

 
일반적으로 아이폰 비디오 레코더를 이용을 하게되면,
mov라를 확장자의 quickTimeMovie라는 방식으로 저장이 되어 진다.
이 파일을 그대로 안드로이드에 전송을 했더니
안드로이드에서는 하드웨어 코덱을 통해서는 재생을 할수가 없었다.
quick time movie 와  mpeg-4는 외부 포멧만 다를뿐 내부의 영상과 음성 코덱은 유사하다.
따라서 빠르게 변환이 가능한 방법이 있지 않을까 하고 찾다가 방법을 찾게 되었다.
바로 iOS 4 부터 지원되는 AssetLibrary를 이용하는 방법이다
이를 통해서 아래와 같이 구현해 보았다.
변환을 원하는 파일의 NSURL 과 저장을 원하는 파일 path의 NSString 을 주면 해당 path에 저장이 되게 된다.
+ (void) convertVideoQtimeToMpeg4:(NSURL *) videoURL withPath:(NSString *)videoPath {
    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil];
    
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

    if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) {
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetPassthrough];
        
        exportSession.outputURL = [NSURL fileURLWithPath:videoPath];
        
        exportSession.outputFileType = AVFileTypeMPEG4;
        
        CMTime start = CMTimeMakeWithSeconds(0.0, 600);
        
        CMTimeRange range = CMTimeRangeMake(start, [avAsset duration]);
        
        exportSession.timeRange = range;
        
        [exportSession exportAsynchronouslyWithCompletionHandler:^{
            
            switch ([exportSession status]) {
                    
                case AVAssetExportSessionStatusFailed:
                    NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);
                    break;

               case AVAssetExportSessionStatusCompleted:
                     NSLog(@"Export Success");
                     break;
                    
                case AVAssetExportSessionStatusCancelled:
                    
                    NSLog(@"Export canceled");
                    
                    break;
                    
                default:
                    
                    break;
                    
            }
            
            [exportSession release];
            
        }];
        
    }
}

이 중에서 초기화 부분이 중요한데 presetName 에
아래처럼 AVAssetExportPresetPassthrough 를 지정해 주어야 다른 포멧으로 변환이 가능하다
 
[[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetPassthrough];
아래와 같이 AVAssetExportPresetMediumQuality 와 같은 파라미터를 주고 outputFileType를 AVFileTypeMPEG로 주게 되면 SIGNAL ABORT가 발생하고 죽게 된다.
 
 AVAssetExportSession *exportSession  = [[AVAssetExportSession alloc]initWithAsset:avAsset AVAssetExportPresetMediumQuality];

exportSession.outputFileType = AVFileTypeMPEG4;
해당 AVAssetExportSession 의 지원되는 output 포멧을 확인하고 싶을때는 AVAssetExportSession 의 supportedFileTypes propert를 통해서 확인해 볼 수가 있다.


추가로 유의 할 것은 이 방식은 asynchronous 이다.

그렇기 때문에 위와 같이 변환을 한 이후에 바로 이를 이용할수 있는것이 아니다
 [exportSession exportAsynchronouslyWithCompletionHandler:^{
            
            switch ([exportSession status]) {
                    
                case AVAssetExportSessionStatusFailed:
                    NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);
                    break;

               case AVAssetExportSessionStatusCompleted:
                     NSLog(@"Export Success");
                     break;
                    
                case AVAssetExportSessionStatusCancelled:
                    
                    NSLog(@"Export canceled");
                    
                    break;
                    
                default:
                    
                    break;
                    
            }
            
            [exportSession release];
            
        }];

당황하지 않길 바란다 이 소스는 위에 있는 전체 소스의 일부분이다. 

따라서 위 소스와 같이 exportAsynchronouslyWithCompletionHandler 를 등록하여 "AVAssetExportSessionStatusCompleted"를 확인해야 한다.

이를 꼭 유의해서 사용하기 바란다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iPhone 개발] UIView 에 간단한 이벤트 적용하기

hagulu 하구루2017. 2. 25. 16:05

Button이 아닌 일반 UIView에 각종 터치 체스췌를 등록하는 방법이다.

iOS sdk4.0부터 지원되는것으로 알고 있다.
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapPiece:)];
[piece addGestureRecognizer:tapGesture];
[tapGesture release], tapGesture = nil;
UITapGestureRecognizer 를 만들고 액션을 지정해주면 된다.

그리고 해당 뷰에 addGestureRecognizer 를통해 등록을 해주면 해당 view에 이벤트를 등록해 줄수 있다.


UIPanGestureRecognizer
UILongPressGestureRecognizer

위처럼 Tab이외에도 여러 이벤트가 있고 잘 활용하면 편하게 이벤트를 관리 할수 있을것이다

댓글

댓글쓰기 폼