카테고리

분류 전체보기 (509)
문학 (128)
찬양 콘티(Continuity) (80)
Business as heritage (6)
IT . Web (148)
Photo (127)
etc. (20)
Total413,824
Today2
Yesterday5






블로그 이미지

최근 직접 만든 앱에서 iOS의 기본 한글 폰트 말고 제가 원하는 폰트를 쓰고 싶어서 여러 가지 시도를 했었습니다.

처음에 로딩 속도가 오래 걸려서 확인해 보니 원인은 아래 명령어의 소요 시간이더라고요.
CoreGraphics / CGFontGetGlyphAdvancesForStyle

스마트폰 앱이 이렇게 대중화된 것 자체가 어떻게 보면 얼떨떨할 정도로 빠르게 이루어진 사건인데, 우리를 놀라게 하는 이 기기의 성능이 아직 그렇게 대단하지는 않은 모양입니다. ^^a


[테스트]

가. 아이팟 터치 2세대
앱 아이콘 클릭 후 7초 정도에서부터 폰트 로딩에 약 20초 소요(디버깅 시 25초 이후로 실행되지만 터치 단독 실행 시 타임 오버로 튕김).

나. 아이폰 4
약 10초 전후로 전체 실행 가능.

실제 앱을 만들어서 게시해도 사용자의 기기 환경을 완전히 예측할 수는 없죠. 그래서 아래의 코드를 적용했습니다.
 
커스텀 폰트 임베딩과 디바이스 네임 관련 부분은 다른 글들을 검색해 보시면 되겠고요.
아래의 코드는 아이팟 1세대와 2세대가 아닐 경우에만 커스텀 폰트 임베딩을 시도하도록 하는 코드입니다.
즉 아이팟 터치는 최신의 레티나 탑재 기종만 나눔고딕을 임베딩하고 폰의 경우에는 모두 임베딩을 시도합니다.

NSString *deviceName = [[UIDevice currentDevice] machine];
if ([deviceName rangeOfString:@"Pod1"].length == 0 && [deviceName rangeOfString:@"Pod2"].length == 0)
{
    [cell.textLabel setFont:[UIFont fontWithName:@"NanumGothicOTF" size:16]];
    [cell.detailTextLabel setFont:[UIFont fontWithName:@"Nanum Pen Script OTF" size:16]];
}


저는 앱 내에서 손쉽게 활용할 수 있게 아예 컨스턴트 메서드constant method를 작성했습니다. 처음 의도와 달리 완전히 레티나 기기 판별을 수행하지는 않지만요.
주석 부분은 실제 반환되는 기기 이름 문자열입니다.

#import "UIDevice.h"
#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDevice(machine)

- (NSString *)machine
{
    size_t size;
    
    // Set 'oldp' parameter to NULL to get the size of the data
    // returned so we can allocate appropriate amount of space
    sysctlbyname("hw.machine", NULL, &size, NULL, 0); 
    
    // Allocate the space to store name
    char *name = malloc(size);
    
    // Get the platform name
    sysctlbyname("hw.machine", name, &size, NULL, 0);
    
    // Place name into a string
    NSString *machine = [NSString stringWithUTF8String:name];
    
    // Done with this
    free(name);
    
    return machine;
}

+ (BOOL)isRetina
{
    NSString *deviceName = [[UIDevice currentDevice] machine];
    if ([deviceName rangeOfString:@"Pod1"].length == 0 && [deviceName rangeOfString:@"Pod2"].length == 0 && [deviceName rangeOfString:@"iPhone1"].length == 0 && [deviceName rangeOfString:@"iPhone2"].length == 0)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

/*
 iPhone Simulator == i386
 iPhone == iPhone1,1
 3G iPhone == iPhone1,2
 3GS iPhone == iPhone2,1
 4 iPhone == iPhone3,1
 1st Gen iPod == iPod1,1
 2nd Gen iPod == iPod2,1
 3rd Gen iPod == iPod3,1
*/

@end 
Posted by One of Remnants

댓글을 달아 주세요

달력

« » 2021.7
        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

최근에 받은 트랙백

글 보관함