반응형

UIabel 위에  UIImageView 를 올려서

이미지를 라벨 위에 노출되도록 하려고 하는데

 

iOS7 에서는 문제 없이 노출되는데

iOS8 에서는 UIImageView가 UILabel 밑으로 들어가 버리는 문제가 생겼습니다.

 

 

UILabel *trainLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, posY, 85, 50)];
[cellView addSubview:trainLabel];
UIImage *noImage = [UIImage imageNamed:@"test.png"]; 
UIImageView *noImageView = [[UIImageView alloc] initWithImage:noImage]; 
noImageView.frame = CGRectMake(0, 0, 18.0, 18.0); 
[trainLabel addSubview:noImageView];

 

 

 

 iOS7 iOS8 






 

 

 

레이어 순서 문제로 보여

Subview들의 layer 순서를 조절할 수 있는 방법을 찾다 보니

다음의 함수를 찾을 수 있었습니다.

 

- insertSubview:(UIView *) aboveSubview:(UIView *)

Inserts a view above another view in the view hierarchy.

Declaration

SWIFT

func insertSubview(_ viewUIView,
      aboveSubview siblingSubviewUIView)

OBJECTIVE-C

- (void)insertSubview:(UIView *)view
         aboveSubview:(UIView *)siblingSubview

Parameters

view
The view to insert. It’s removed from its superview if it’s not a sibling ofsiblingSubview.
siblingSubview
The sibling view that will be behind the inserted view.

Discussion

This method establishes a strong reference to view and sets its next responder to the receiver, which is its new superview.

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

 

참고: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/insertSubview:aboveSubview:

 

 

addSubview 대신 insertSubView: aboveSubview 를 이용하여

 

 

UIImage *noImage = [UIImage imageNamed:@"test.png"]; 
UIImageView *noImageView = [[UIImageView alloc] initWithImage:noImage]; 
noImageView.frame = CGRectMake(trainLabel.frame.origin.x, trainLabel.frame.origin.y, 18.0, 18.0);
[cellView insertSubview:noImageView aboveSubview:trainLabel];

 

 

위와 같이 수정하니

iOS8에서도 iOS7와 같이 UILabel 위에 UIImageView 를 놓을 수 있었습니다.

 

조금이나마 도움 되셨기를.... ^^

반응형
반응형

아이폰 앱 다운로드 링크

 

NSURL *appStoreURL = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id123456789"];[[UIApplication sharedApplication]openURL:appStoreURL];

 

참고

http://stackoverflow.com/questions/433907/how-to-link-to-apps-on-the-app-store

반응형
반응형

지난 WWDC에서 iOS 9가 발표되면서 apple developer 사이트에도 iOS 9 베타 버전이 공개되었는데요,

 

그래서인지 벌써부터 iOS 9 베타를 설치하시는 분들이 많이 계시더군요.

 

그런데 iOS 9로 업데이트한 후 운영 중인 앱이 사용할 수 없다는 VOC가 들어오더군요.

 

마침 xcode 7 베타 버전도 같이 공개되어 부랴부랴 다운로드 받아서 설치해 봤습니다.

 

시뮬레이터로 확인해 보니

 

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

CFNetwork SSLHandshake failed (-9824)

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."

 

secure connection 이 필요하다는 메시지가 나오네요.

 

검색을 해보니 iOS 9.0 이상에서는 ATS(App Transport Security)라는 기술이 나오네요.

 

결론은 app - web 간 connection 에서는 secure connection 이 기본값이라는 ....

 

그런데 서버가 특A급은 아니다 보니.... 아무래도 SSL 암복호화 부하를 무시할 수는 없어서....

 

로그인이 필요 없는 일부 기능만이라도  SSL을 좀 피해보려고....

 

관련 내용을 찾아 봤습니다.

 

찾아보니 info.plist 에서 예외 처리를 할 수 있더군요.

 

NSAppTransportSecurity > NSAllowsArbitraryLoads : true 로 설정하면 ATS 를 비활성화 할 수 있습니다.

 

 

 

또는

 

 

 

 

다시 리빌드 해보니 정상적으로 사용이 가능하네요.

 

조금이나마 도움 되시기를....

 

※ 참고

 

https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html

 

https://github.com/facebook/react-native/issues/1563

반응형
반응형

API를 통해 JSON 데이터를 받아

version의 NEWIVERSION을 찾아 NSUserDefaults에 값을 저장하는 로직입니다.

 

 

    NSString *ver = [[mainInfoDict objectForKey:@"version"] objectForKey:@"NEWIVERSION"];      if (ver != nil) {         [[NSUserDefaults standardUserDefaults] setObject:ver forKey:@"NEWIVERSION"];         [[NSUserDefaults standardUserDefaults] synchronize];     } 

 

그런데 API에 문제가 생겨 NEWIVERSION을 가져오지 못하게 되자

시뮬레이터에서 App이 죽는 현상이 발생하더군요.

 

Attempt to set a non-property-list object null as an NSUserDefaults/CFPreferences value for key NEWIVERSION

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object null for key NEWIVERSION'

 

NEWIVERSION key를 갖는 값 자체가 존재하지 않다 보니

Null 객체 insert 오류가 생겼던 거 같습니다.

 

그래서 NSNull 객체 검사를 추가해 봤습니다. 

 

    NSString *ver = [[mainInfoDict objectForKey:@"version"] objectForKey:@"NEWIVERSION"];      if (ver != nil &&         ![ver isEqual:[NSNull null]]) {         [[NSUserDefaults standardUserDefaults] setObject:ver forKey:@"NEWIVERSION"];         [[NSUserDefaults standardUserDefaults] synchronize];     } 

 

이렇게 처리하고 나니 API에서 오류가 발생해도 App 중지 없이 실행할 수 있었습니다.

 

 

반응형

+ Recent posts