간단하게 A에서 z까지 문자열 결합 속도 테스트.. 약 60번 append 메소드가 실행된다.

NSString의 stringByAppending~~과 NSMutableString의 append를 비교했다. NSString은 매번 객체를 생성하는 방식이므로 느릴것이다~라고 예상.

-(void)testAppend1 {

NSString *result = @"";

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

for (char c = 'A' ; c <= 'z'; c++) {

result = [result stringByAppendingFormat:@"%c", c];

}

NSLog(@"Result of NSString with stringByAppendingFormate : time : %f", [NSDate timeIntervalSinceReferenceDate] - start);

}


-(void)testAppend2 {

NSMutableString *result = [NSMutableString string];

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

for (char c = 'A' ; c <= 'z'; c++) {

[result appendFormat:@"%c", c];

}

NSLog(@"Result of NSMutable with append method : time : %f", [NSDate timeIntervalSinceReferenceDate] - start);

}


기기에서 돌린 결과, NSMutableString을 이용한 방식이 약 20배 이상 빠르다.

매번 결과가 달라지긴 하다만..

Result of NSString with stringByAppendingFormate : time : 0.011139

Result of NSMutable with append method : time : 0.000614






반응형

NSXMLParser를 이용한 파싱에서 한글과 영어가 섞인 항목에서 한영 분리 현상이 발생하고 있다.

Event-Driven 파싱을 할때 NSXMLParser의 겔리게이트 중

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 메소드를 이용한다.

XML  문서가 아래와 같이 


영문 + 한글 형식이면

<tag>abc가나다</abc>


abc | 가나다 가 분리된다.


이상현상으로는

영문 + 한글 + 영문 형식이면

<tag>abc가나다def</abc>

의 경우에는

abc | 가나다def 로 분리된다.



한글 + 영문 + a 으로 시작하는 경우에는?

<tag>가나다abc라마바def</abc>


가나다abc라마바def 가 하나의 토큰으로 인식된다.

반응형
iOS에 UIBezierPath를 연습해보고 있다.
태극 문양을 한번 그려보고 기록을 남긴다.
일단 인증~ 오전 1시 34분의 위용!



코드는 아래에~

UIBezierPath *path = [UIBezierPath bezierPath];


[[UIColor blueColor] setFill];

[path moveToPoint:CGPointMake(20, 220)];

[path addArcWithCenter:CGPointMake(90, 220) radius:70.0 startAngle:M_PI endAngle:M_PI*2 clockwise:NO];

[path addArcWithCenter:CGPointMake(230, 220) radius:70.0 startAngle:M_PI endAngle:M_PI*2 clockwise:YES];

[path addArcWithCenter:CGPointMake(160, 220) radius:140.0 startAngle:M_PI*2 endAngle:M_PI clockwise:YES];

[path fill];


path = [UIBezierPath bezierPath];

[[UIColor redColor] setFill];

[path moveToPoint:CGPointMake(20, 220)];

[path addArcWithCenter:CGPointMake(90, 220) radius:70.0 startAngle:M_PI endAngle:M_PI*2 clockwise:NO];

[path addArcWithCenter:CGPointMake(230, 220) radius:70.0 startAngle:M_PI endAngle:M_PI*2 clockwise:YES];

[path addArcWithCenter:CGPointMake(160, 220) radius:140.0 startAngle:M_PI*2 endAngle:M_PI clockwise:NO];

[path fill];


반응형
보통 Tint를 이용해서 UI 컴포넌트의 색상을 변경할 수 있지만 TabBar에는 도통 색상을 변경하는 방법이 보이지 않는다.

Interface Builder에서 Tint 설정



TabBar의 색상을 변경하는 방법을 찾아봤으니.. 아래의 왼쪽은 기본적인 TabBar의 모습이고 오른쪽은 색상을 입힌 TabBar의 모습니다.




아이디어는 간단하다.
UITabBarController는 UIViewController의 일종이며, UIViewController가 최소 하나의 UIView와 연결되어 있듯이 UITabBarController도 UITabBar라는 UIView와 연결되어 있다. UITabBar에 색을 입힌 View를 추가하면 된다.

아래와 같은 코드면 위의 예제와 같은 효과를 얻을 수 있다.
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 480, 49)];
v.backgroundColor = [UIColor colorWithRed:0.6 green:0.2 blue:0.2 alpha:0.6];
[[tabBarController tabBar] insertSubview:v atIndex:0];


반응형
iOS4와 함께 발표된 XCODE 3.2.3 에는 이전 기기를 선택하는 부분이 보이지 않는다.
  
Legacy 지원에 인색한 잡스이지만, 너무 이른거 아닌가!



새로운 옵션 - iPhone OS Deployment Target 이라는 메뉴가 생기고, 2.X와 3.X 버전을 선택할 수 있다.




반응형
아이패드에 관한 소식과 기대감?이 모락모락 피어오르는 가운데 애플에서 iPad SDK GM Seed(이름 참~ 길다)버전이 나왔다고 친절히 메일을 보내왔다.

베타2, 3을 쓰면서 IB(인터페이스 빌더)의 버그로 추정되는 현상으로 고생을 한 적이 있어서 그동안 나온 베타를 눈여겨보지는 않는데 이번에는 GM이라는 네이밍에 다운로드를 걸어넣고 릴리즈 노트와 차이점을 확인해본다.


Beta6?

릴리즈 노트에 의하면 GM은 베타6이다.


3.1과 3.2의 차이점

iPAD에는 아이폰 OS 3.2로 동작을 한다. 물론 아이폰을 위한 3.2도 준비되어 있을 것이다.


API Diff 문서를 통해서 어떤 기능이 달라지는지 확인을 해 본다.


폰트와 단락 스타일

CoreText라는 항목으로 아래의 헤더 파일들이 추가되어 있다.
CTFont.h
CTFontCollection.h
CTFontDescriptor.h
CTFontTraits.h
CTFrame.h
CTFramesetter.h
CTGlyphInfo.h
CTLine.h
CTParagraphStyle.h
CTRun.h
CTRunDelegate.h
CTStringAttributes.h
CTTextTab.h
CTTypesetter.h
CoreText.h


미디어 플레이어 부분

MPMoviePlayerController.h 에 다수의 메소드들이 추가
MPMoviePlayerViewController.h 추가


UI킷

UIKit에 상당히 많은 변화가 생겼다.

제스처를 도입하여 터치 이벤트를 다루기가 쉬워질 것이다.
3.1에서는 터치 시작, 터치 이동, 터치 이벤트 완료 등의 이벤트로 처리를 하느라 다소 복잡한 수식 계산이 필요했다.
UIDocumentInteractionController.h추가
UIGestureRecognizer.h 추가
UIGraphics.h PDF관련 메소드 추가
UILongPressGestureRecognizer.h 추가

UIPanGestureRecognizer.h 추가
UIPinchGestureRecognizer.h 추가
UIPopoverController.h 추가
UIRotationGestureRecognizer.h 추가
UISwipeGestureRecognizer.h 추가
UITapGestureRecognizer.h 추가

UIView.h 에
Added -[UIView addGestureRecognizer:]
Added -[UIView removeGestureRecognizer:]

iPAD에 소개된 SplitView이다. 그리고 스펠 체커.

UISplitViewController.h 추가
UITextChecker.h 추가
UITextInput.h 추가

SplitView 샘플



자주 쓰는 TableView의 백그라운드뷰가 생겼다.(야호!)
UITableView.backgroundView 추가


UIViewController.h에 모달 뷰에 관련해서 아래와 같은 스타일 상수값이 추가되었다. 아마도 다양한 형태의 모달이 가능해지리라 예상해본다.
UIModalPresentationFullScreen
UIModalPresentationPageSheet
UIModalPresentationFormSheet
UIModalPresentationCurrentContext









반응형
iPad가 발표되고 같이 나온 SDK.
SDK를 테스트 해보고자 XCode 3.2(beta)를 설치했다.

별도의 xib로 만든 테이블 셀이 로딩이 안되는 문제가 발생하고 있다. 아마도 Interface Builder의 버그?인듯.
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (UITableViewCellContentView)'

그래서 XCode를 Uninstall 하고 이전 버전 3.1.2로 롤백~

모든 에러가 나는 xib를 열어서 다시 저장하는 삽질을 하는 중.
반응형
테이블의 한 열을 선택하면 선택된 열은 다른 셀이 나오게 하는 방법이다.

Table에 내용을 표시하기 위해서는 TableDataSource의 Delegation의 메소드를 작성해야 한다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


이 메소드는 테이블의 각 셀을 반환하는 메소드이다.


여기서 테이블의 셀이 선택되었는지를 비교해야한다. 즉 인수로 넘어온 index와 테이블에 선택된 index가 같으면 선택되었을때의 셀을 반환하면 되고 아니면 보통의 셀을 반환하면 된다.

if (indexPath == [tableView indexPathForSelectedRow]) {
    return SelectedCell;
} else {
    return NormalCell;
}

이것만으로는 부족하다. 왜냐하면 화면에 테이블이 나오는 시점은 모든 셀을 그려버린 상태이기 때문이다. 그러면 셀을 선택한 순간에 선택한 셀을 다시 그려주면 된다.


셀을 선택하면 UITableViewDelegate의 didSelectRowAtIndexPath 메소드가 호출된다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath


이 곳에서 셀을 다시 그리라고 아래의 메소드를 호출한다.


- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths   withRowAnimation:(UITableViewRowAnimation)animation


indexPaths는 indexPath의 배열이다. 즉 다수의 셀을 한번에 그릴수 있다.


두번째 인자는 에니메이션 효과이다.

   UITableViewRowAnimationFade
   UITableViewRowAnimationRight
   UITableViewRowAnimationLeft
   UITableViewRowAnimationTop
   UITableViewRowAnimationBottom
   UITableViewRowAnimationNone


그러면 테이블의 셀을 선택하면 didSelectRowAtIndexPath가 호출되고 이곳에서 reloadRowsAtIndexPaths메소드를 이용하여 셀을 다시 그리게끔 한다.




끝인가? 아니다.


다른 셀을 선택하게되면 새롭게 선택한 셀을 다시 그리지만 선택되었던 셀을 다시 그릴수 없다. 그래서 아마도 하얗게(혹은 배경색으로) 변할 것이다.


이를 위해서 다른 셀을 선택할때 기존에 선택된(포커스를 잃어버리게 되는) 셀도 다시 그려줘야 한다. 


-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath


위의 메소드가 선택되었다가 선택되지 않은 상태가 될때(Deselect) 호출되는 메소드이다. 여기서도 위의 reload메소드를 이용하여 다시 그려준다.



하나더!


만약에 셀의 크기가 다르다면? 즉 높이가 다르다면..


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath


셀의 높이를 반환하는 메소드이다. 여기서 셀이 선택되었는지 아닌지를 비교해서 높이를 반환하면 된다.






반응형
  1. 알 수 없는 사용자 2013.01.04 10:16

    필요한 정보가 마침 여기 있어서 도움이 되었습니다.
    감사합니다~

+ Recent posts