2012년 12월 24일 월요일

iOS 팁 - 프로그래스바를 가지고 있는 AlertView


- (void)createProgressionAlert
{
    progressAlert = [[UIAlertView alloc] initWithTitle:@"리소스 다운로드" message:@"중요 리소스를 다운로드 받고 있습니다. 잠시 기다려 주세요." delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    // Create the progress bar and add it to the alert
    progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(30.0f, 90.0f, 225.0f, 90.0f)];
    [progressAlert addSubview:progressView];
    [progressView setProgressViewStyle:UIProgressViewStyleBar];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30.0f, 100.0f, 225.0f, 40.0f)];
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.textAlignment = UITextAlignmentRight;
    label.font = [UIFont systemFontOfSize:14.0f];
    label.text = @"";
    label.tag = 1;
    [progressAlert addSubview:label];
    
    [progressAlert show];
    [progressAlert release];
}


progressView 는 헤더 파일에서 선언 한다.

label에 접근 하기 위해서 는

UILabel *label = (UILabel *)[progressAlert viewWithTag:1];

이렇게 하면 접근 가능 하다.

네트워크에서 무언가를 내려 받거나 할 때 진행 그래프 표시용 으로 사용하면 된다.

iOS팁 약관 동의 같은 긴 문서를 보여 줄때


UITextView *txtEULA = [[[UITextView alloc] initWithFrame:CGRectMake(45,145,225, 320) autorelease];
로 잘 붙여 넣고

setText를 하면 된다.

그럼 그 긴 문장을 다 쳐 넣어야 하느냐?


- (NSString *)agreeText {
    
    NSString *str = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"agree" ofType: @"txt"] usedEncoding:nil error:nil];
    return str;
}




[txtEULA setText:[self agreeText]];


agrreText 메서드는
앱에서 파일로 읽어 들인다.

프로젝트에 agree.txt파일을 추가 하고

파일에서 내용을 얻어다가 txtEULA에 넣어 주면 된다.




2012년 12월 10일 월요일

mountain lion에서 Windows 한글 text파일 열기 문제

아직도 smi파일은 windows 에서 windows dos 인코딩 (949 ) 로 인코딩 되어 잇는 파일이 많다.
osx는 UTF-8이라서 기본 설정된 상태에서는 이러한 텍스트 파일을 osx에서 열면
먼 글인지 알아 볼수가 없다.

TextWrangler는 앱으로 파일을 열어 보면 알아 볼수가 없다.
이프로그램을 사용해본 사람이라면 인코딩 환경 설정에서 다음과 같이 추가 할 것이다.

하지만 그래도 효과가 없다.

어째 서지 분명히  한글 관련된 인코딩을 모두 추가 했는데... 

여러 방법을 다 동원해도 안된다.

마운틴 라이언에 버그인가?

나는 라이언에서 분명 TextWrangler로 잘 열고 UTF-8로 변환도 잘했는데....

해답은
마운틴 라이언에 기본 텍스트 편집기에 환경설정에서
파일 열 때를 클릭
한국어 인코딩을 선택해 주어야 한다.

아무래도 TextWrangler는 내부 코드가 마운틴 라이언에 텍스트 편집기에 의존적 인것 같다.

이렇게 설정 하고 나니 도스용 한글 ( cp-949) 인코딩된 텍스트 파일이 보기 좋게 열린다.

2012년 12월 3일 월요일

iOS 프로그래밍 팁 - UITextField로 전화번호 입력 받기


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

}

델리게이트 함수에

다음과 같은 코드가 필요하다.

3자가 넘어가면 - (대쉬) 추가
010-
또 8자가 넘어가면 (대쉬) 추가
010-674-

여기서 번호자리가 5자가 되면
가운데 3자리가 4자리가 되게

이거 그대로 코딩을 하면

NSString stringWithFormat:과

txtField setText:
를 이용하면 된다.

NSUInteger currentLength = textField.text.length;
        NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet];
         
        if (range.length == 1) {
            return YES;
        }
        
        if ([numbers characterIsMember:[string characterAtIndex:0]]) {
           if ( currentLength == 3 ) {
                if (range.length != 1) {
                    NSString *firstThreeDigits = [textField.text substringWithRange:NSMakeRange(0, 3)];
                    NSString *updatedText;
                    
                    if ([string isEqualToString:@"-"]) {
                        updatedText = [NSString stringWithFormat:@"%@",firstThreeDigits];
                    } else {
                        updatedText = [NSString stringWithFormat:@"%@-",firstThreeDigits];
                    }
                    
                    [textField setText:updatedText];
                }
            } else if ( currentLength > 3 && currentLength < 8 ) {
                if ( range.length != 1 ) {
                    NSString *firstThree = [textField.text substringWithRange:NSMakeRange(0, 3)];
                    NSString *dash = [textField.text substringWithRange:NSMakeRange(3, 1)];
                    
                    NSUInteger newLenght = range.location - 4;
                    NSString *nextDigits = [textField.text substringWithRange:NSMakeRange(4, newLenght)];
                    NSString *updatedText = [NSString stringWithFormat:@"%@%@%@",firstThree,dash,nextDigits];
                    [textField setText:updatedText];
                }
            } else if ( currentLength == 8 ) {
                if ( range.length != 1 ) {
                    NSString *areaCode = [textField.text substringWithRange:NSMakeRange(0, 3)];
                    NSString *firstThree = [textField.text substringWithRange:NSMakeRange(4, 3)];
                    NSString *nextDigit = [textField.text substringWithRange:NSMakeRange(7, 1)];
                    [textField setText:[NSString stringWithFormat:@"%@-%@-%@",areaCode,firstThree,nextDigit]];
                }
            } else if ( currentLength == 12 ) {
                if ( range.length != 1 ) {
                    NSString *areaCode = [textField.text substringWithRange:NSMakeRange(0, 3)];
                    NSString *firstThree = [textField.text substringWithRange:NSMakeRange(4, 3)];
                    NSString *nextDigit = [textField.text substringWithRange:NSMakeRange(8, 1)];
                    NSString *nextDigit2 = [textField.text substringWithRange:NSMakeRange(9, 3)];
                    [textField setText:[NSString stringWithFormat:@"%@-%@%@-%@",areaCode,firstThree,nextDigit,nextDigit2]];
                }
            }
        } else {
            return NO;
        }
        return YES;

2012년 12월 2일 일요일

iOS 프로그래밍 팁 - UIPickerView



UIPickerView를 하단에 ActionSheet와 조합하고 닫기 버튼까지 함께 세트로


    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                             delegate:nil
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];
    
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    
    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    
    [actionSheet addSubview:pickerView];
    [pickerView release];
    
    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"확인"]];
    closeButton.momentary = YES;
    closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor blackColor];
    [closeButton addTarget:self action:@selector(dismissActionSheet:) forControlEvents:UIControlEventValueChanged];
    [actionSheet addSubview:closeButton];
    [closeButton release];
    
    [actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];
    
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];


헤더파일에는 UIPickerViewDelegate, UIPickerViewDataSourec 를 선언부에 추가 해두고
아래와같이 델리게이트 함수를 추가하고 열수 행수 그리고 데이터 문자열을 출력하는 
함수를 구현해 준다.

//열수
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
}

//행수
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {

}

//데이터
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
}



2012년 12월 1일 토요일

2012 late mac mini review

고급형 95만원짜리 맥미니 
CTO 선택을 전혀 안했다. 하드디스크 1TB 하나에 CPU 2.3Ghz i7 쿼드
그래픽은 HD4000
여기에 메모리만 16기가로 업데이트 했다.

메모리가 4기가 모델인데 16기가로 업데이트 하면 HD4000이 공유 메모리로 768MB 가져간다.
4기가 일때는 384MB를 가져가는거 같다.

그래픽에 성능은 잘모르겠으나 CPU에 성능은 정말 대단하다.

현재 2012년 12월 1일 대략 1달간 사용한 경험으로는 2007년 c2d1.83ghz 모델에 비해 체감 속도가 수십배 빠른 느낌
2008년 imac 24인치에 비해 10배는 빠른 느낌 이랄까
주로 맥으로 집에서 하는일은 소소한 iphone 앱개발
주로 사용하는 어플은  xcode인데 2007 맥미니에서는 xcode4가 너무 무겁게 느껴 졌는데
이번 모델에서는 너무 가볍다.
어떤 앱을 사용해야 이 머신을 괴롭힐수 있으려나.


결국 16기가에 메모리와 이엄청난 쿼드 코어 CPU를 마구 마구 사용하는 방법은 VirtualBox
이다.
여기에 xp설치, windows 7 설치, ubuntu 12.10 설치

Virtual Box속에 설치된 7에 성능지수는 T60 (c2d1.83 3GB) 모델 보다 그래픽 빼고는
모두 압서는것 같다.

네이티브 windows 7머신 T60 노트북 보다 더빠른 성능을 내는듯한 이 무서운 괴물 머신이다.

1개월 가량 써본 최신에 맥미니 대만족이다.


2012년 11월 12일 월요일

iOS 프로그래밍 팁 - view전환시 fade in 에니메이션

기본으로 제공하는 뷰 전환 에니메이션이 아니라
점점 밝기 등으로 전환 하고자 할때
back
loginViewController를 점점 밝게 나오게 하고자 한다면.

loginViewController = [[LoginViewController alloc]init];
    loginViewController.view.frame = CGRectMake(0,0,320,460);
    
    loginViewController.view.alpha = 0;
    [UIView beginAnimations:@"fadein" context:nil];
    [UIView setAnimationDuration:0.5];
    loginViewController.view.alpha = 1;
    [self.view addSubview:loginViewController.view];
    [UIView commitAnimations];

back 버튼으로 뒤로 돌아가고자 할때 동일하게 효과를 주면서
removeFromSuperview 를 하려면.

[UIView animateWithDuration:0.5
                     animations:^{self.view.alpha = 0.0;}
                     completion:^(BOOL finished){ [self.view removeFromSuperview]; }];

2012년 8월 9일 목요일

iOS 프로그래밍 팁 - 10 웹페이지를 보여주는 ViewController 만들기

그냥 UIWebView를 사용하는건데
UIActivityIndicatorView를 좀 써서 페이지 여는 동안 가운데 에서 동글 동글 돌리려면
UIWebViewDelegate 프로토콜 메서드 두개를 구현해주고
UIActivityIndicatorView를 start/ stop 해주면 된다.


헤더 파일


#import <UIKit/UIKit.h>

@interface WebViewController : UIViewController <UIWebViewDelegate> {
    
    UIActivityIndicatorView *webActInd;
}

@end

m파일
- (void)viewDidLoad
{
    [super viewDidLoad];
    //Web URL View 
    UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 45, 320, 415)];
    [webView setDelegate:self];
    
 NSString *url = @"http://mtsparrow.blogspot.kr";
    
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
    [self.view addSubview:webView];
    [webView release];
}



- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    // 액티비티인디케이터 설정
webActInd = [[UIActivityIndicatorView alloc
  initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[webActInd setFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)];
    [webActInd setCenter:CGPointMake(320/2, 480/2)];
[self.view addSubview:webActInd];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // Do any additional setup after loading the view.
    webActInd = nil;

}

- (void)dealloc
{
    [super dealloc];
    
    [webActInd release];
}


// 뷰를 부르기 시작
- (void)webViewDidStartLoad:(UIWebView *)webView {
[webActInd startAnimating];
}

// 뷰가 화면에 표시
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    
[webActInd stopAnimating];
}



2012년 8월 8일 수요일

iOS 프로그래밍 팁 - 9 UITextFiled의 글쓰기 시작할때 UI 올리고 내리기

UITextFiled가 들어가는 앱 즉.. 유틸 같은 앱을 배포한 적이 없다.
그래서 이러한 부분을 잘몰랐다.

간단한 보드 게임을 주로 만들기 때문에 ...

그래도 ID입력받고  Password입력받고 등등..

이러한 간단한 입력 작업은 많을 것이고 입력 시작 과함께 키보드가 나오고
입력 창은 같이 위로 올라 가야 한다.

키보드에 가리면 낭패...


- (void)textViewDidBeginEditing:(UITextView *)textView {
    self.view.frame = CGRectMake(0, -200, self.view.frame.size.width, self.view.frame.size.height);
}

입력이 시작될 때 view 를 200 만큼 위로 올리는 것이다.

그리고 화면 아무 데나 누르면 다시 내려가고 원위치를 해야 할 것이다.

- (void)textViewDidEndEditing:(UITextView *)textView{
    self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}

아무 데나 누르면?
아래와 같이 해주면 된다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    [txtFieldID resignFirstResponder];
    [txtFieldPasswd resignFirstResponder];
    [self.view endEditing:YES]; 
}









2012년 8월 7일 화요일

iOS 프로그래밍 팁 - 8 카드 뒤집기 효과

닥치고 기억 앱에서 사용된 카드를 선택하면 앞 그림이 보였다가 다시 원래 뒷 그림으로
일반적인 같은 짝 찾기 게임에서 사용하는 방법이다.

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:btn cache:YES];
는 사실 뷰콘트롤러 전환시에 유틸리티의 경우 정보 버튼을 누르면 일반적으로 이효과 로
뷰 콘트롤러가 넘어가게 많이 만든다.
이를 버튼에 이미지에 적용해서 카드 게임에서 카드 뒤집기 효과를 내는 것이다.



btnClick 메서드에서

toFrontBtnImage 메서드를 호출하고

toFrontBtnImage 메서드는 앞면으로 바뀌는 에니메이션을

만일 정답이라면 그대로
틀린 경우
toBackBtnImage 메서드르 호출 해서 뒷면으로 바뀌느 에니메이션을
하면 된다.

toFrontBtnImage의 구현

img = [UIImage imageNamed:fileName];         //<--- 앞면 이미지 얻기
    flagSide[btn.tag] = FRONT;
   
    CGPoint startpoint = CGPointMake(0, 0);
    [img drawAtPoint:startpoint];

    [UIView beginAnimations:@"toFrontBtnImage" context:nil];
    [UIView setAnimationDuration:ANIMATION_DURATION];
   
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:btn cache:YES]; <-- 뒤집기 효과
   
    [btn setImage:img forState:UIControlStateNormal];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    [UIView commitAnimations];

toBackBtnImage의 구현
같은 방법으로 이미 정의된 뒷면 그림 파일을 이용


 UIImage * img;
    img = [UIImage imageNamed:@"back.png"];
    flagSide[btn.tag] = BACK;
   
    CGPoint startpoint = CGPointMake(0, 0);
    [img drawAtPoint:startpoint];
   
    [UIView beginAnimations:@"toBackBtnImage" context:nil];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; // 빠져나갈때 가속
   
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:btn cache:YES];
   
    [btn setImage:img forState:UIControlStateNormal];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    [UIView commitAnimations];

animationDidStop 메서드에서는 정답일때 오답일때를 검출해서 toBackBtnImage를 다시 호출 하거나
정답일때 처리를 구현 해주면 된다.



2012년 8월 6일 월요일

iOS 프로그래밍 팁 - 7 UIPlaceHolderTextView

UITextField 는 placeholder 프로퍼티가 존재한다.
입력전에 grayColor로 보여주다가 입력이 시작되면 사라지는 것이다.

근데 멀티라인을 입력 할수 있는 UITextView는 이러한 placeholder프로퍼티가 없다.

UITextView 를 상속 받고 NSString *placeholder, 와 UIColor *placeholderColor 를
가지고 있는 UIPlaceHolderTextView를 만들어 사용할수 있다.

UIPlaceHolderTextView.h

#import <Foundation/Foundation.h>


@interface UIPlaceHolderTextView : UITextView {
    NSString *placeholder;
    UIColor *placeholderColor;
    
@private
    UILabel *placeHolderLabel;
}

@property (nonatomic, retain) UILabel *placeHolderLabel;
@property (nonatomic, retain) NSString *placeholder;
@property (nonatomic, retain) UIColor *placeholderColor;

-(void)textChanged:(NSNotification*)notification;

@end

UIPlaceHolderTextView.m
#import "UIPlaceHolderTextView.h"


@implementation UIPlaceHolderTextView

@synthesize placeHolderLabel;
@synthesize placeholder;
@synthesize placeholderColor;

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [placeHolderLabel release]; placeHolderLabel = nil;
    [placeholderColor release]; placeholderColor = nil;
    [placeholder release]; placeholder = nil;
    [super dealloc];
}

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self setPlaceholder:@""];
    [self setPlaceholderColor:[UIColor lightGrayColor]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
}

- (id)initWithFrame:(CGRect)frame
{
    if( (self = [super initWithFrame:frame]) )
    {
        [self setPlaceholder:@""];
        [self setPlaceholderColor:[UIColor lightGrayColor]];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
    }
    return self;
}

- (void)textChanged:(NSNotification *)notification
{
    if([[self placeholder] length] == 0)
    {
        return;
    }
    
    if([[self text] length] == 0)
    {
        [[self viewWithTag:999] setAlpha:1];
    }
    else
    {
        [[self viewWithTag:999] setAlpha:0];
    }
}

- (void)setText:(NSString *)text {
    [super setText:text];
    [self textChanged:nil];
}

- (void)drawRect:(CGRect)rect
{
    if( [[self placeholder] length] > 0 )
    {
        if ( placeHolderLabel == nil )
        {
            placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
            placeHolderLabel.lineBreakMode = UILineBreakModeWordWrap;
            placeHolderLabel.numberOfLines = 0;
            placeHolderLabel.font = self.font;
            placeHolderLabel.backgroundColor = [UIColor clearColor];
            placeHolderLabel.textColor = self.placeholderColor;
            placeHolderLabel.alpha = 0;
            placeHolderLabel.tag = 999;
            [self addSubview:placeHolderLabel];
        }
        
        placeHolderLabel.text = self.placeholder;
        [placeHolderLabel sizeToFit];
        [self sendSubviewToBack:placeHolderLabel];
    }
    
    if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
    {
        [[self viewWithTag:999] setAlpha:1];
    }
    
    [super drawRect:rect];
}

@end


참고 : http://stackoverflow.com/questions/1328638/placeholder-in-uitextview



2012년 8월 5일 일요일

iOS 프로그래밍 팁 - 6 UITextFieldDelegate Protocol Methods 작업하기

UITextField를 작업할때 클래스 선언에 <UITextFieldDelegate> 해준 다음 다음과 같이 
메소드들을 구현해줘야 한다.



#pragma mark UITextFieldDelegate Protocol Methods
// 텍스트 필드의 내용이 변경될 실행된다.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
//textField 의 text.length >= 100 등으로 글자 수 제한을 할수 있다.

//특수 문자 입력 제한도 할수 있다.
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

return [string isEqualToString:filtered];


    return YES; // NO 리턴할 경우 변경내용이 반영되지 않는다.
}

// 텍스트 필드의 내용이 삭제될 실행된다. clearButtonMode 속성값이 UITextFieldViewModeNever 아닌 경우에만 실행된다.
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    
    return YES; // NO 리턴할 경우 변경내용이 반영되지 않는다.
}

// 텍스트 필드 편집을 시작할때 실행된다.
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    
    return YES; // 편집을 허용하지 않고자 경우 NO 리턴한다.
}

// 텍스트 필드 편집이 시작된 (First Responder ) 실행된다.
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    
}

// 텍스트 필드 편집이 종료될때 실행된다.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    
    
    return YES; // NO 리턴할 경우 편집을 종료하지 않는다.
}

// 텍스트 필드 편집이 종료된 후에 실행된다.
- (void)textFieldDidEndEditing:(UITextField *)textField
{
}



-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    
    // return 키가 눌려지면 return키가 눌려진 텍스트 필드의 FirstResponder 해제한다
    
    [textField resignFirstResponder];
    
    return YES;
    
}

2012년 7월 28일 토요일

iOS 프로그래밍 팁 - 5 UITextView 라운드 처리

알바를 하는데 TextFiled 도 써야 하고 멀티 라인을 입력 받는  UITextView도 써야 한다.

근데 디자인 가이드에 멀티라인을 입력받는 부분도 모두 둥글게 라운드 처리 되어야 한다고 한다.

UITextView는 그냥 사각인데
TextFiled는 borderStyle = UITextBorderStyleRoundedRect;
로 처리 하면 둥글 둥글해지는데.
UITextView는 저 속성이 없다.


해결방법은 있다.


#import <QuartzCore/QuartzCore.h>

    txtContent.layer.cornerRadius = 5;
    txtContent.clipsToBounds = YES;

이렇게 하면 UITextFiled의 UITextBorderStyleRoundedRect랑 비슷하게
어울린다.

참고글..
http://stackoverflow.com/questions/1824463/how-to-style-uitextview-to-like-rounded-rect-text-field


2012년 7월 26일 목요일

iOS 프로그래밍 팁 - 4탄 ViewController 회전막기

앱을 만들다 보면 회전이 되어서는 안되는 앱도 필요하다.

자동으로 회전 되는 코드가 ViewController에 디폴트로 설정 되어 있다.

이를 주석 처리 해주면 된다.


//- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
//{
//    // Return YES for supported orientations
//    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
//        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
//    } else {
//        return YES;
//    }
//}

수직 방향만 회전이 되게 하고 싶다면
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

해주면 된다.



2012년 7월 25일 수요일

iOS 프로그래밍 팁 - 3 StatusBar 감추기


게임을 만들때 반드시 처리해야 할일 상태바를 감춰야 한다.

게임에서는 상태바에 시간 베터리 양이 보이면 상대적으로 몰입도가 떨어진다.

아무리 보드게임이라 할지라도 반드시 없애 줘야 사용자가 좀더 게임에 몰입한다.

이게 근데 어떻게 설정 해서 하는건지 모르면 난감하다.


AppDelegate 소스에

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Hide the status bar
    [UIApplicationsharedApplication].statusBarHidden = YES;

위와 같은 간단한 코드로 해결이 된다.

오늘의 팁은 끝!

2012년 7월 24일 화요일

xcode 4 code snippet 사용하기

XCode에서 자주쓰는 코드를 빠르게 찾아서 코딩 하는 방법을 제공한다.
회사 동료덕에 알게된 기능인데
이걸 잘 활용하면 프로그래밍 속도가 붙을거 같다.

사용방법은
control + option + command + 2

View --> Utilities --> Show Code Snippet Library
를 선택하면 오른쪽 하단에  Xcode가 디폴트로 제공하는 것들이 보인다.

내 코드를 추가 하고 싶다면 Xcode  에디터에서 코드를 선택한다음 드레그 하여
그위치에 넣으면 간단한 대화 상자를 입력 하면 끝이다.

이렇게 만든 코드는 짧은 키워드로 빠르게 이용할수 있고
찾아서 드레그 해서 놓아도 된다.

두대 이상의 컴퓨터의 Xcode에서 공유하고 싶다면?

~/Library/Developer/Xcode/UserData/CodeSnippets/


이 경로를 ucloud나 Daum클라우드 같은 소프트웨어로 공유하면 끝이다.


iOS 프로그래밍팁 - 2탄 이미지 회전

이 팁은 그냥장기판 에서 장기알을 뒤집기 위해 이용했다.

한 초 에서 한에 이미지도 사실 보는 한자를 읽는 방향으로 이미지가 이루어져 있다.
처음에는 이를 모두 그래픽툴로 뒤집어서 사용했다.

하지만 이미지 리소스를 원본 그대로 하고 코드로 180도 회전시킬수 있다면
그러한 수고는 필요 없다.

역시 알지 못하면 손발이 고생한다.

그냥장기판 앱에서는 한의 장기 알이 180도 회전 되어야 하고
그래야 사람대 사람이 둘때 공평하게 가독성(?) 이 있다고 생각 했다.
또한 한쪽 진영에 잇는 모든 탭바및  탭바 컨트롤 버튼등도 모두 180도 회전
되어 있어야 공평하다.

 toolbar2.transform = CGAffineTransformMakeRotation(3.141592);

툴바의 회전이다.


메세지 박스로 이용하는 UIAlertView의 회전은 transform = CGAffineTransformMakeRotaion()을 이용해도 되지 않는다.


이는 살짝 꼼수가 필요하다. 

아래와 같이 단말기에 상태를 바꿔 줘야 UIAlertView를 회전 시킬수 있다.
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortraitUpsideDown;

이로서 그냥 장기판 앱은 위에서 보나 아래서 보나 같은 UI와 같은 AlertView를 구현 하였다.


2012년 7월 23일 월요일

iOS 프로그래밍팁 - 1탄 앱 삭제 할때처럼 좌우로 흔들 흔들 효과

이번 팁은 닥치고덧셈
에서 힌트를 누르면 정답 숫자 들이 흔들 흔들
마치 앱을 삭제 할때 롱터치 하고 나면 아이콘이 흔들 흔들 거리는 효과이다.


        
        CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-5.0));
        CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(5.0));
        
        btn.transform = leftWobble;  
        
        [UIView beginAnimations:@"wobble" context:btn];
        [UIView setAnimationRepeatAutoreverses:YES]; 
        [UIView setAnimationRepeatCount:10];
        [UIView setAnimationDuration:0.2];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];
        
        btn.transform = rightWobble; 
        
        [UIView commitAnimations];



- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{
    if ([finished boolValue]) {
        UIView* item = (UIView *)context;
        item.transform = CGAffineTransformIdentity;
    }
}


btn (UIButton) 객체를 leftWooble, rightWooble로 transform 하면서 흔들 흔들 
10회 하도록 하는 에니메이션이다.