반응형

스토리보드 show the identity inspector
key path에 추가

키 : _placeholderLabel.textColor

타입 : 컬러

반응형
블로그 이미지

앱스페이스

,

safearea frame

iOS/objective-c 2019. 1. 24. 12:10
반응형

os 11 이상


frame = window.safeAreaLayoutGuide.layoutFrame


inset = window.safeAreaInsets



반응형
블로그 이미지

앱스페이스

,
반응형

[[UIDevice currentDevice] setProximityMonitoringEnabled:YES];

반응형
블로그 이미지

앱스페이스

,
반응형

[[NSUserDefaults standardUserDefaults] setObject:@[ @"ko" ] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];





반응형
블로그 이미지

앱스페이스

,
반응형
출처 카페 > 맥부기 애플(Apple OS.. | 퓨리넬
원문 http://cafe.naver.com/mcbugi/326999
구글맵 SDK 를 이용한 OpenStreet Map 오프라인 맵 구현하기.

안녕하세요. 퓨리넬입니다.

제가 예전에 구글맵 지도 다운로드 기능 구현에 대해 질문을 올린적이 있었는데요, 답이 없길래 직접 구현해 봤습니다.
아주 간단하게 만들 수 있었던 것인데 너무 어렵게 생각했었나봐요. 

1. Tile
Tile 이라는 개념이 있습니다. 구글맵 SDK에서 어떻게 사용하는지 https://developers.google.com/maps/documentation/ios-sdk/tiles 에 나와 있습니다.
현재 화면에 보여지는 지도 화면의 경도, 위도, zoom level 값으로 zoom, x, y 좌표를 구하고 이 좌표에 대한 Tile 데이터를 불러옵니다.

이 때 개발자는 TileLayer 의 클래스를 상속받아 자신이 원하는 타일 데이터를 가져올 수 있습니다.
GMSSyncTileLayer 와 GMSURLTileLayer 가 있는데 저는 GMSSyncTileLayer 를 상속받아 사용하였습니다.
GMSURLTileLayer 는 상속받아 클래스를 만들어 사용하는것이 아니라 GMSTileURLConstructor 라는 block을 만들어 x, y, zoom 좌표를 가지고 원하는 URL을 만들어 요청할 수 있게 합니다. 단순히 URL만 바꿀 수 있고 상속받아 사용할 수 없도록 만들어졌습니다.(GMSURLTileLayer is a concrete class that cannot be subclassed.)

2. Map Data
타일 레이어를 이용하여 원하는 지도 데이터를 불러와야 겠는데 일단 구글맵은 약관에 지도데이터를 따로 저장하여 사용하는것을 금지하고 있다고 합니다.
그래서 무료로 사용할 수 있는 맵을 찾아보니 Open Street Map(http://www.openstreetmap.org/) 과 Open Cycle Map(http://www.opencyclemap.org/) 이 있었습니다.
zoom level, x, y 로 만들어진 Tile은 이들 맵 역시 마찬가지 였습니다.
해당 내용은 http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames 에서 'Zoom levels' 항목을 보시면 되겠습니다.

그리고 Tile servers 에 OpenStreetMap, OpenCycleMap등의 지도 데이터 요청 URL이 있기 때문에 이것을 사용하면 되겠습니다.
OpenStreetMap 의 경우 http://[abc].tile.openstreetmap.org/{zoom}/{x}/{y}.png 입니다. 앞의 [abc] 는 안붙이고 http://tile.로 해도 되었습니다.


3. Code
저는 단순히 지도 데이터를 Open Street Map으로 불러오는 것이 아니라 이미지 데이터를 저장도 해야 하는 것이었습니다. 그래서 GMSURLTileLayer를 사용할 이유는 없었습니다.
GMSSyncTileLayer 를 상속받으면 

- (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom;

를 구현해 줍니다.

저는 일단 [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; 로 Document 디렉토리를 불러와
zoom, x, y 좌표에 해당하는 지도 이미지를 불러오도록 합니다.
NSString *fileName = [NSString stringWithFormat:@"%@/osm/%zd/%zd/%zd.png", _documentPath, zoom, x, y];
UIImage *img = [UIImage imageWithContentsOfFile:fileName];

그런데 처음에는 당연이 img는 nil일테니, 서버에 요청을 해야 하겠습니다.


처음에는 온라인 상태에서 지도를 보는 용도로 GMSURLTileLayer 를 사용하였고, 저장된 지도를 볼 때에는 GMSSyncTileLayer 를 상속받는 클래스를 사용하였습니다.
이렇게 두 개가 나뉘어졌기 때문에 쓸데없이 코드를 분기하고, GMSURLTileLayer 를 사용하여 Open Street Map 을 볼 때 다운받은 지도에 대한 데이터를 저장할 수 없었습니다.
지도 데이터는 사용자가 별도로 저장을 실행하면 다운받게 할 수 있지만, 일반적인 캐싱을 하는 것처럶 이왕이면 한 번 받은 지도 데이터를 저장하여 굳이 다시 서버에 요청을 하거나 지도 저장 실행시 다시 다운받지 않도록 하고 싶었습니다.
그러나 GMSURLTileLayer 는 상속받아 사용할 수 없고, GMSTileURLConstructor 라는 block 은 NSURL 만 리턴해줄 뿐이기 때문에 다운받은 지도 데이터는 어떻게 해야할 지 고민이었습니다.

그런데 GMSURLTileLayer 는 아예 사용할 필요가 없었습니다.
GMSSyncTileLayer 상속받은 클래스에서 - (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom; 가 실행될 때 메인스레드에서 호출되는것이 아니었습니다.
이미 서브스레드에서 실행되고 있기 때문에 여기서 동기로 데이터를 받아 리턴해주면 되겠다고 생각하였습니다.

그래서 대충 다음과 같이 작성하였습니다.
if(img == nil) {
  NSString *stringUrl = [NSString stringWithFormat:@"http://tile.openstreetmap.org/%zd/%zd/%zd.png", zoom, x, y];
  NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]];
  img = [UIImage imageWithData:imgData];
  [imgData writeToFile:fileName atomically:NO];
}
return img;

그리고 이 타일 레이어 클래스는
_googleMap.mapType = kGMSTypeNone;
self.offlineTileLayer = [[GSOfflineTileLayer alloc] init];
_offlineTileLayer.map = _googleMap;

으로 사용하게 됩니다.
구글맵의 mapType 을 none으로 해야 구글의 지도가 나오지 않습니다.
그리고 다시 구글맵을 표시할 때에는 [_offlineTileLayer clearTileCache]; 을 해주고 제거하면 되겠습니다.

이렇게 하면 구글맵 SDK 를 이용하여 구글맵을 이용하는 한편, 사용자가 원할 경우 Open Street map 등의 다른 지도를 이용하면서 오프라인 맵 기능을 사용할 수 있습니다.
혹은 사용자가 미리 iTunes를 이용하여 document에 직접 넣어 사용할 수도 있겠습니다.

4. Download

화면에 보이고 있는 지도화면에서 더 높은 zoom level 의 지도 데이터까지 한 번에 다운로드 할 경우에는
보여지고 있는 화면의 가장 위 오른쪽, 가장 아래 왼쪽 의 경도, 위도 와 최소 zoom, 최대 zoom 값이 필요합니다.

그리고 두 좌표와 min/max 를 이용하여 몇 개의 tile를 다운받는지 총 count를 먼저 해야겠습니다.

#define M_PI        3.14159265358979323846264338327950288


- (NSUInteger)tileCountForSouthWest:(CLLocationCoordinate2D)southWest northEast:(CLLocationCoordinate2D)northEast minZoom:(NSUInteger)minZoom maxZoom:(NSUInteger)maxZoom

{

    NSUInteger minCacheZoom = minZoom;

    NSUInteger maxCacheZoom = maxZoom;


    CLLocationDegrees minCacheLat = southWest.latitude;

    CLLocationDegrees maxCacheLat = northEast.latitude;

    CLLocationDegrees minCacheLon = southWest.longitude;

    CLLocationDegrees maxCacheLon = northEast.longitude;


    NSAssert(minCacheZoom <= maxCacheZoom, @"Minimum zoom should be less than or equal to maximum zoom");

    NSAssert(maxCacheLat  >  minCacheLat,  @"Northernmost bounds should exceed southernmost bounds");

    NSAssert(maxCacheLon  >  minCacheLon,  @"Easternmost bounds should exceed westernmost bounds");


    NSUInteger n, xMin, yMax, xMax, yMin;


    NSUInteger totalTiles = 0;


    for (NSUInteger zoom = minCacheZoom; zoom <= maxCacheZoom; zoom++)

    {

        n = pow(2.0, zoom);

        xMin = floor(((minCacheLon + 180.0) / 360.0) * n);

        yMax = floor((1.0 - (logf(tanf(minCacheLat * M_PI / 180.0) + 1.0 / cosf(minCacheLat * M_PI / 180.0)) / M_PI)) / 2.0 * n);

        xMax = floor(((maxCacheLon + 180.0) / 360.0) * n);

        yMin = floor((1.0 - (logf(tanf(maxCacheLat * M_PI / 180.0) + 1.0 / cosf(maxCacheLat * M_PI / 180.0)) / M_PI)) / 2.0 * n);


        totalTiles += (xMax + 1 - xMin) * (yMax + 1 - yMin);

    }


    return totalTiles;

}


그리고 한번에 다운받는 부분은 Mapbox Offine 샘플에서 가져왔는데 대략적인것만 붙이겠습니다.


- (void)mapImageDownload:(NSInteger)totalCount {


    CGSize size = self.bounds.size;

    CGPoint point = {00};

    point.x = size.width;

    CLLocationCoordinate2D northEast = [_googleMap.projection coordinateForPoint:point];

    point.x = 0;

    point.y = size.height;

    CLLocationCoordinate2D southWest = [_googleMap.projection coordinateForPoint:point];

    NSUInteger minZoom = zoomLevel;

    NSUInteger maxZoom = 19;

    NSUInteger minCacheZoom = minZoom;

    NSUInteger maxCacheZoom = maxZoom;

    

    CLLocationDegrees minCacheLat = southWest.latitude;

    CLLocationDegrees maxCacheLat = northEast.latitude;

    CLLocationDegrees minCacheLon = southWest.longitude;

    CLLocationDegrees maxCacheLon = northEast.longitude;


    dispatch_queue_t dQueue = dispatch_queue_create("MapDownload"NULL);

    dispatch_async(dQueue, ^{

        NSUInteger n, xMin, yMax, xMax, yMin;

        NSString *documentPath = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectoryNSUserDomainMaskYESobjectAtIndex0];

        NSFileManager *fileManager = [NSFileManager defaultManager];


        for (NSUInteger zoom = minCacheZoom; zoom <= maxCacheZoom; zoom++) {

            n = pow(2.0, zoom);

            xMin = floor(((minCacheLon + 180.0) / 360.0) * n);

            yMax = floor((1.0 - (logf(tanf(minCacheLat * M_PI / 180.0) + 1.0 / cosf(minCacheLat * M_PI / 180.0)) / M_PI)) / 2.0 * n);

            xMax = floor(((maxCacheLon + 180.0) / 360.0) * n);

            yMin = floor((1.0 - (logf(tanf(maxCacheLat * M_PI / 180.0) + 1.0 / cosf(maxCacheLat * M_PI / 180.0)) / M_PI)) / 2.0 * n);

            

            for (NSUInteger x = xMin; x <= xMax; x++) {

                for (NSUInteger y = yMin; y <= yMax; y++) {

NSString *stringUrl = [NSString stringWithFormat:@"http://tile.openstreetmap.org/%zd/%zd/%zd.png", zoom, x, y];

                        NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]];



어쩌고 저쩌고 하면 되겠습니다.


제가 이것 때문에 고민이 많았는데 누군가에게 도움이 되었으면 좋겠습니다.


아 그런데 이렇게 하면 메모리를 좀 더 많이 쓰는 느낌이 드네요. ㅎㅎ


의견 있으시면 댓글 부탁드립니다.


반응형
블로그 이미지

앱스페이스

,
반응형
출처 카페 > 맥부기 애플(Apple OS.. | 블로
원문 http://cafe.naver.com/mcbugi/326666

안녕하세요 

주소록이 iOS9 부터 Contact.Framework로 대체됨에 따라 샘플이 필요해서 만들어봤는데,

제 글 아랫글에 황정수님이 주소록 불러오는 샘플이 있어서 참고하고, 

전 그 외에 추가하기, 삭제하기 등 다른 기능들 정리한김에 공유해드립니다.


필요하신분들은 나중에 보고 쓰세요~

샘플프로젝트는 깃허브에 올려놓았습니다.


https://github.com/minjoongkim/iOS9-Contacts.framework-AddressBook-Sample




1. 주소록 불러오기

CNAuthorizationStatus status = [CNContactStoreauthorizationStatusForEntityType:CNEntityTypeContacts];

if( status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted)

{

    NSLog(@"access denied");

}

else

{

    //Create repository objects contacts

    CNContactStore *contactStore = [[CNContactStore allocinit];

    

    NSArray *keys = [[NSArray alloc]initWithObjects:CNContactIdentifierKeyCNContactEmailAddressesKeyCNContactBirthdayKeyCNContactImageDataKeyCNContactPhoneNumbersKeyCNContactViewController.descriptorForRequiredKeysnil];

    

    // Create a request object

    CNContactFetchRequest *request = [[CNContactFetchRequest allocinitWithKeysToFetch:keys];

    request.predicate = nil;

    

    [contactStore enumerateContactsWithFetchRequest:request

                                              error:nil

                                         usingBlock:^(CNContact__nonnull contact, BOOL__nonnull stop)

     {

         // Contact one each function block is executed whenever you get

         NSString *phoneNumber = @"";

         if( contact.phoneNumbers)

             phoneNumber = [[[contact.phoneNumbers firstObjectvaluestringValue];

         

         NSLog(@"phoneNumber = %@", phoneNumber);

         NSLog(@"givenName = %@", contact.givenName);

         NSLog(@"familyName = %@", contact.familyName);

         NSLog(@"email = %@", contact.emailAddresses);

         

         

         [contactList addObject:contact];

     }];

    

    [contactTableView reloadData];

}





2. 주소록 피커뷰로 불러오기

-(IBAction)loadContactPickerView{

    // Create a new picker

    CNContactPickerViewController *contactPicker = [[CNContactPickerViewControllerallocinit];

    // Select property to pick

    [contactPicker setDisplayedPropertyKeys:[[NSArray allocinitWithObjects:CNContactEmailAddressesKeynil] ];

    [contactPicker setPredicateForEnablingContact:[NSPredicatepredicateWithFormat:@"emailAddresses.@count > 0"]];

    [contactPicker setPredicateForSelectionOfContact:[NSPredicatepredicateWithFormat:@"emailAddresses.@count == 1"]];

    // Respond to selection

    contactPicker.delegate = self;

    // Display picker

    [self presentViewController:contactPicker animated:YES completion:nil];


}




3. 주소록 추가하기

-(void)saveContact:(NSString*)familyName givenName:(NSString*)givenName phoneNumber:(NSString*)phoneNumber {

    CNMutableContact *mutableContact = [[CNMutableContact allocinit];

    

    mutableContact.givenName = givenName;

    mutableContact.familyName = familyName;

    CNPhoneNumber * phone =[CNPhoneNumber phoneNumberWithStringValue:phoneNumber];

    

    mutableContact.phoneNumbers = [[NSArray allocinitWithObjects:[CNLabeledValuelabeledValueWithLabel:CNLabelPhoneNumberiPhone value:phone], nil];

    CNContactStore *store = [[CNContactStore allocinit];

    CNSaveRequest *saveRequest = [[CNSaveRequest allocinit];

    [saveRequest addContact:mutableContact toContainerWithIdentifier:store.defaultContainerIdentifier];

    

    NSError *error;

    if([store executeSaveRequest:saveRequest error:&error]) {

        NSLog(@"save");

        [self reloadContactList];

    }else {

        NSLog(@"save error");

    }

}




4. 주소록 업데이트하기

-(void)updateContact:(CNContact*)contact memo:(NSString*)memo{

    CNMutableContact *mutableContact = contact.mutableCopy;

    

    mutableContact.note = memo;


    CNContactStore *store = [[CNContactStore allocinit];

    CNSaveRequest *saveRequest = [[CNSaveRequest allocinit];

    [saveRequest updateContact:mutableContact];

    

    NSError *error;

    if([store executeSaveRequest:saveRequest error:&error]) {

        NSLog(@"save");

    }else {

        NSLog(@"save error : %@", [error description]);

    }

}

5. 주소록 삭제하기

-(void)deleteContact:(CNContact*)contact {

    CNMutableContact *mutableContact = contact.mutableCopy;

    

    CNContactStore *store = [[CNContactStore allocinit];

    CNSaveRequest *deleteRequest = [[CNSaveRequest allocinit];

    [deleteRequest deleteContact:mutableContact];

    

    NSError *error;

    if([store executeSaveRequest:deleteRequest error:&error]) {

        NSLog(@"delete complete");

        [self reloadContactList];

    }else {

        NSLog(@"delete error : %@", [error description]);

    }

}



6. 주소록 상세보기

-(void)loadContactView:(CNContact*)contact {

    // Create a new contact view

    CNContactViewController *contactController = [CNContactViewControllerviewControllerForContact:contact];

    contactController.delegate = self;

    contactController.allowsEditing = YES;

    contactController.allowsActions = YES;


    // Display the view

    [self.navigationController pushViewController:contactController animated:YES];

}


반응형
블로그 이미지

앱스페이스

,
반응형
출처 카페 > 맥부기 애플(Apple OS.. | 블로
원문 http://cafe.naver.com/mcbugi/326609

안녕하세요 

iOS9에서 UIAlertView 사용하면 경고창이 떠서 UIAlertController 대한 간단한 코드입니다.


필요하신분들 있으실거 같아서 공유해드릴께요.


1,2,3번은 UIAlertControllerStyleAlert 샘플이고4번은UIAlertControllerStylerActionSheet입니다1,2번의 타입에 preferredStyle바꿔주시면 완성됩니다.




1. 기본 AlertView





UIAlertController *alertController = [UIAlertController

                                      alertControllerWithTitle:@"simpleAlert"

                                      message:@"UIAlertControllerStyleAlert"

                                     preferredStyle:UIAlertControllerStyleAlert];



[self presentViewController:alertController animated:YEScompletion:nil];






2. 버튼이 있는 AlertView





UIAlertController *alertController = [UIAlertController

                                      alertControllerWithTitle:@"simpleAlert"

                                      message:@"UIAlertControllerStyleAlert"

                                      preferredStyle:UIAlertControllerStyleAlert];



UIAlertAction *cancelAction = [UIAlertAction

                               actionWithTitle:@"Cancel"

                               style:UIAlertActionStyleCancel

                               handler:^(UIAlertAction *action)

                               {

                                   NSLog(@"Cancel action");

                               }];


UIAlertAction *okAction = [UIAlertAction

                           actionWithTitle:@"OK"

                           style:UIAlertActionStyleDefault

                           handler:^(UIAlertAction *action)

                           {

                               NSLog(@"OK action");

                          }];


UIAlertAction *resetAction = [UIAlertAction

                              actionWithTitle:@"Reset"

                              style:UIAlertActionStyleDestructive

                              handler:^(UIAlertAction *action)

                              {

                                  NSLog(@"Reset action");

                              }];

[alertController addAction:resetAction];

[alertController addAction:cancelAction];

[alertController addAction:okAction];


[self presentViewController:alertController animated:YEScompletion:nil];








3. TextInputAlert




-(IBAction)textFieldAlert:(id)sender{

    

    UIAlertController *alertController = [UIAlertController

                                          alertControllerWithTitle:@"TextInputAlert"

                                          message:@"Plane and secure text input"

                                          preferredStyle:UIAlertControllerStyleAlert];

    

    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField)

     {

         [textField addTarget:self

                       action:@selector(alertTextFieldDidChange:)

             forControlEvents:UIControlEventEditingChanged];

         textField.placeholder = @"LoginPlaceholder";

     }];

    

   [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField)

     {

         textField.placeholder =@"PasswordPlaceholder";

         textField.secureTextEntry = YES;

     }];

    

    UIAlertAction *okAction = [UIAlertAction

                               actionWithTitle:@"OK"

                               style:UIAlertActionStyleDefault

                               handler:^(UIAlertAction *action)

                               {

                                   UITextField *login = alertController.textFields.firstObject;

                                   UITextField *password = alertController.textFields.lastObject;

                                   NSLog(@"login = %@", login.text);

                                   NSLog(@"password = %@", password.text);

                               }];

    

    okAction.enabled = NO;

    [alertController addAction:okAction];

    [self presentViewController:alertController animated:YEScompletion:nil];

}


- (void)alertTextFieldDidChange:(UITextField *)sender

{

    UIAlertController *alertController = (UIAlertController *)self.presentedViewController;

    if (alertController)

    {

        UITextField *login = alertController.textFields.firstObject;

        UIAlertAction *okAction = alertController.actions.lastObject;

        okAction.enabled = login.text.length > 2;

    }

}


참고로 TextField 들어가게 되면 UIAlertControllerStyleActionSheet 타입을 이용할수 없습니다만약 이용하게 되면 아래와 같은 에러가 납니다.


*** Assertion failure in -[UIAlertController addTextFieldWithConfigurationHandler:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UIAlertController.m:434

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Text fields can only be added to an alert controller of style UIAlertControllerStyleAlert'








4. ActionSheet









UIAlertController *alertController = [UIAlertController

                                      alertControllerWithTitle:@"simpleAlert"

                                      message:@"UIAlertControllerStyleAlert"

                                      preferredStyle:UIAlertControllerStyleActionSheet];



UIAlertAction *cancelAction = [UIAlertAction

                               actionWithTitle:@"Cancel"

                               style:UIAlertActionStyleCancel

                               handler:^(UIAlertAction *action)

                               {

                                   NSLog(@"Cancel action");

                               }];


UIAlertAction *okAction = [UIAlertAction

                           actionWithTitle:@"OK"

                           style:UIAlertActionStyleDefault

                           handler:^(UIAlertAction *action)

                           {

                               NSLog(@"OK action");

                           }];


UIAlertAction *resetAction = [UIAlertAction

                              actionWithTitle:@"Reset"

                              style:UIAlertActionStyleDestructive

                              handler:^(UIAlertAction *action)

                              {

                                  NSLog(@"Reset action");

                              }];

[alertController addAction:resetAction];

[alertController addAction:cancelAction];

[alertController addAction:okAction];


[self presentViewController:alertController animated:YEScompletion:nil];


반응형
블로그 이미지

앱스페이스

,
반응형

- (void) setData:(NSString *)name selector:(NSString*)name

{
 UIBarButtonItem *addNotiBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(NSSelectorFromString(name))];

}



반응형

'iOS > objective-c' 카테고리의 다른 글

[공유] iOS9 Contacts.framework 연락처 불러오기(상세)  (0) 2018.12.12
[공유] UIAlertController 간단한 코드입니다  (0) 2018.12.12
반각->전각  (0) 2018.12.12
ios7 status bar hidden  (0) 2018.12.12
nsstring, nsdata 변환  (0) 2018.12.12
블로그 이미지

앱스페이스

,

반각->전각

iOS/objective-c 2018. 12. 12. 16:39
반응형

NSString *string;

NSMutableString *convertedString = [string mutableCopy];

CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformFullwidthHalfwidth, false);

반응형

'iOS > objective-c' 카테고리의 다른 글

[공유] UIAlertController 간단한 코드입니다  (0) 2018.12.12
nsstring selector 지정  (0) 2018.12.12
ios7 status bar hidden  (0) 2018.12.12
nsstring, nsdata 변환  (0) 2018.12.12
NSString 대문자-> 소문자, 소문자-> 대문자  (0) 2018.12.12
블로그 이미지

앱스페이스

,
반응형

숨길 viewcontroller 에 추가

 

- (BOOL)prefersStatusBarHidden

{

    return YES;

}

반응형

'iOS > objective-c' 카테고리의 다른 글

nsstring selector 지정  (0) 2018.12.12
반각->전각  (0) 2018.12.12
nsstring, nsdata 변환  (0) 2018.12.12
NSString 대문자-> 소문자, 소문자-> 대문자  (0) 2018.12.12
화면 자동 꺼짐 방지  (0) 2018.12.12
블로그 이미지

앱스페이스

,