iOS2012. 10. 5. 16:39

녹음하는 어플 테스트중 스피커 관련해서 고심중 아래와 같이 AVAudioxxx를 이용할때 AVAudioSession을 사용하는데,

아래중에서 카테고리가 무엇을 의미하는지 궁금합니다.


예)

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

[audioSession setActive:YES error:nil];


카테고리 종류)

AVAudioSessionCategoryAmbient;

AVAudioSessionCategorySoloAmbient;

AVAudioSessionCategoryPlayback;

AVAudioSessionCategoryRecord;

AVAudioSessionCategoryPlayAndRecord;

AVAudioSessionCategoryAudioProcessing;



추가로 클래스나 함수나 변수등 설명 괜찮게 나온곳 없나요? 영어라도 상관없긴 한데..XCODE의 도큐먼트는 설명이 너무 간단해서..

제가 잘못 알고있는건지도 모르지만..뭐 여하튼 한글이면 매우 좋고, 영어라도 상관없는데 최소한 위에 제가 질문한것 정도는 나와있는 도큐먼트는 없나요?

Posted by 다오나무
iOS2012. 10. 5. 16:25

다음은 오디오 세션 카테고리에 대한 설명이다.


UserInterfaceSoundEffects: 벨/무음 스위치를 따름. 다른 사운드와 섞일 수 있음. 예) 탭에 대한 피드백, 시작음

AmbientSound: 벨/무음 스위치를 따름. 다른 사운드와 섞일 수 있음. 예) 부가적인 소리 및 잡음

SoloAmbientSound: 벨/무음 스위치를 따름. 다른 사운드와 섞일 수 없음. 예) 게임 사운드트랙

MediaPlayback: 벨/무음 스위치를 따르지 않음. 다른 사운드와 섞일 수 없음. 예) 노래, 비디오, 스트리밍 오디오

LiveAudio: 벨/무음 스위치를 따르지 않음. 다른 사운드와 섞일 수 없음. 예) 음악이나 실시간으로 사용자가 만든 사운드

RecordAudio: 벨/무음 스위치를 따르지 않음. 다른 사운드와 섞일 수 없음. 예) 사용자 녹음

PlayAndRecord: 벨/무음 스위치를 따르지 않음. 다른 사운드와 섞일 수 없음. 예) 음성 변조 어플리케이션과 같이 동시에 오디오를 입출력하는 경우

Posted by 다오나무
iOS2012. 9. 13. 13:17

UIViewController 를 이용한 메인뷰 또는 특정뷰에서 일련의 백그라운드 작업시 대기상태를 나타내주는 여러 방법(Modal Popup, Spinner, SubView 등...)들 중에, 카테고리를 이용하여 간단한 Method 호출로 UIViewController 에 오버레이되는 View 를 생성해 보자.


CREATE CATEGORY 


UIViewControll+OverlayView.h

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>
 
@interface UIViewController (OverlayView)
 
-(void)showLayer:(NSString *)message;
-(void)hideLayer;
@end

UIViewController+OverlayView.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#import "UIViewController+OverlayView.h"
 
@implementation UIViewController (OverlayView)
 
-(void)showLayer:(NSString *)message
{
    UIView *layer = [[UIView alloc] initWithFrame:self.view.bounds];
    // layer.alpha = 0.5;
    layer.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.5];
     
    /* Create Label */
    UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];
    label.textAlignment = UITextAlignmentCenter;
    label.lineBreakMode = YES; // 개행 설정.
    label.numberOfLines = 0; // 개행 숫자에 제한을 두지 않음.
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.text = message;
    [layer addSubview:label];
    [label release];
     
    /* Add LayerView */
    [self.view addSubview:layer];
    [layer release];
}
 
-(void)hideLayer
{
    NSArray *subViews = [self.view subviews];
    UIView *layer = [subViews lastObject];
    [layer removeFromSuperview];
}
@end

※ alpha 를 적용하게되면, UIView *layer 에 올라오는 컨트롤 및 서브뷰들도 해당 alpha value 가 적용되어 보여진다. 반면, backgroundColor 는 해당 View 에만 alpha value 가 적용된다.


USING CATEGORY


ViewController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "ViewController.h"
#import "UIViewController+OverlayView.h"
 
@implementation ViewController
- (IBAction)onBtnAction:(id)sender {
    [self showLayer:@"MESSAGE TO SHOW"];
     
    [self performSelector:@selector(onHideLayer) withObject:nil afterDelay:2.0f];
}
 
- (void)onHideLayer
{
    [self hideLayer];
}
@end

테스트를 위해, 생성된 오버레이뷰를 performSelector 로 2초후 해제되게 작성. UIViewController 를 서브클래싱하는 클래스들에서 해당 카테고리를 임포트하여, 간단히 카테고리 메소드 호출.


RESULT


스크린샷 처럼, Spinner (UIActivityIndicatorView) 를 표시하거나 기타 다른 컨트롤뷰도 해당 오버레이뷰에 추가하여 프로젝트 성격에 맞게끔 커스터마이징.

1
2
3
4
5
6
7
8
9
/* Create Spinner */
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    spinner.center = CGPointMake(160, 200);
    spinner.hidesWhenStopped = NO;
    spinner.tag = 100;
    [layer addSubview:spinner];
     
    [spinner startAnimating];
    [spinner release];

Posted by 다오나무
iOS2012. 9. 10. 21:57

iOS 개발 하다 보니 image를 crop 하거나 resize를 해야 하는 경우가 많더구요.

구글링 해보니 괜찮게 만들어 놓은 소스도 많아서 참고해서 UIImage에 Category로 만들어서 사용하고 있습니다. 


  1. @implementation UIImage ( NBUIImageCrop )
  2. - (UIImage *)crop:(CGRect)rect {
  3.     if (self.scale > 1.0f) {
  4.         rect = CGRectMake(rect.origin.* self.scale,
  5.                           rect.origin.* self.scale,
  6.                           rect.size.width * self.scale,
  7.                           rect.size.height * self.scale);
  8.     }
  9.    
  10.     if ([self imageOrientation] == UIImageOrientationLeft) {
  11.         rect.size = CGSizeMake(rect.size.height, rect.size.width);
  12.         rect.size = CGSizeMake(rect.size.height, rect.size.width);
  13.         rect.origin = CGPointMake(rect.origin.y, rect.origin.x);
  14.     }
  15.     else if ([self imageOrientation] == UIImageOrientationRight) {
  16.         rect.size = CGSizeMake(rect.size.height, rect.size.width);
  17.         rect.origin = CGPointMake(rect.origin.y, rect.origin.x);
  18.     }
  19.  
  20.     CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
  21.     UIImage *result = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation];
  22.     CGImageRelease(imageRef);
  23.     return result;
  24. }
  25.  
  26. - (UIImage *)resizeToFitWidth:(CGFloat)width
  27. {
  28.     CGSize size = CGSizeMake(width, self.size.height * width/self.size.width);
  29.     UIGraphicsBeginImageContext(size);
  30.     [self drawInRect:CGRectMake(0,0,size.width,size.height)];
  31.     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
  32.     UIGraphicsEndImageContext();
  33.     return newImage;
  34. }

Posted by 다오나무