아이폰도 다양한 사이즈의 기기들이 출시되면서 Autolayout 없이는 개발하기 힘들어졌습니다. Autolayout 적용하면서 제일 애먹었던 곳은 UIScrollView였습니다. iPhone6+ 에서는 한 화면에서 볼 수 있는 컨텐츠이지만 그 보다 작은 iPhone4S, iPhone5 기기에서는 ScrollView 없이는 볼 수 없는 경우가 있습니다. 다른 뷰 Autolayout 적용하는 것과 살짝 다른 점이 있는데 아래에 소개하겠습니다.


ScrollView 내에 ContentView 만들기

먼저 UIView에 SubView를 올리듯 UIScrollView에 뷰를 올리면 위와 같이 Scrollable Content Size Ambiguity 라는 에러를 마주하게 됩니다. UIScrollView 에 서브뷰를 붙일 때에는 빈 UIView를 먼저 올려주세요. 이 뷰를 ContentView라고 칭하겠습니다. ContentView 안에 SubView들을 붙이면 됩니다.


ContentView를 UIScrollView에 딱 맞게 Constraint를 지정합니다. 그렇게 하면 Missing Constraints 라며 Need constraints for: X position or width, Need constraints for: Y position or height라고 역시 에러가 뜨지만 일단 무시하세요.


ContentVIew의 Width를 ScrollView의 Width와 동일하게 맞춰줍니다. Equal Widths 아시겠죠? 이제 X position, width 관련된 Constraint를 만족했으므로 에러 하나는 사라졌습니다. 



그리고 이번에는 Y position, Height 관련된 Constraint를 맞춰줍니다. 여기는 ContentView를 클릭하고 오른쪽 바에보면 Content Compression Resistance Priority 메뉴에 Intrinsic Size가 있습니다. 여기에 Default값으로 설정되어있는데 그 것을 Placeholder로 바꿔줍니다. 그러면 모든 에러가 사라진 것을 볼 수 있습니다. 이제 ScrollView에 들어가는 모든 SubView들은 이 ContentView에 붙여주면 됩니다.


여기서 그냥 실행해보면 ContentView의 Height가 0이 되어 스크롤도 안되고 터치도 안될 거예요. ContentView의 Height는 제일 하단에 있는 SubView에 맞춰야겠죠? 아래에 5개의 Label을 예제로 붙여보았습니다. 

5th Label의 하단 Constraint가 중요합니다. 저 뷰까지 ContentVIew가 커버해줘야 ScrollView가 제대로 보이겠죠.



5th Label의 bottom space to Container를 설정해줍니다. 저는 10 정도의 간격을 주었습니다.



지금 이 Xib에서는 5th Label이 Superview와 간격이 10이 되지 않아 위와 같은 에러를 냅니다.

5th Label를 선택하고 오른쪽 바에서 Vertical space Constraint에 relation을 Greater Than or Equal로 변경해줍니다.


그럼 모든 에러가 사라졌습니다. iPhone8 plus와 iPhone5로 테스트 해보겠습니다.


iPhone 8Plus는 스크린 사이즈가 커서 모든 Label를 한 화면에 보여주고 있습니다.



      

iPhone5s는 사이즈가 작아서 5th Label이 끊기죠? 하단으로 정상적으로 스크롤 되는 것을 볼 수 있습니다.


UIScrollView도 이런 식으로 하면 Autolayout을 문제없이 적용할 수 있습니다.

'개발 > iOS' 카테고리의 다른 글

UIScrollView에서 Autolayout 적용하기  (1) 2017.11.21
Fat Framework 만들기  (0) 2017.11.17
Symbol(s) not found for architecture x86_64 에러  (0) 2017.11.15
  1. 2018.02.28 14:47

    비밀댓글입니다

Fat Framework 만들기

이번에는 저번 포스팅에 이어서 Fat Framework를 만드는 법을 소개하겠습니다. 프레임워크가 시뮬레이터, 실물 기기에서 모두 동작하기 위해서 x86_64, i386, ARM64, ARMv7 등의 아키텍쳐를 모두 지원하는 프레임워크를 만들어야 합니다. 앱스토어에 배포하기 위해서는 시뮬레이터 아키텍쳐를 반드시 지원하지 않아도 되지만 테스트할 때 다양한 기기를 보유하지 않다면 불편한 점이 많습니다.


Fat Framework로 만들 예제 프레임워크로 SDWebImage 프레임워크를 사용하겠습니다. 일단 기본적으로 Fat Framework는 lipo 명령어로 만들 수 있습니다.

각각의 아키텍쳐로 빌드 후 lipo 명령어를 이용하여 하나의 Fat Framework 를 생성하면 됩니다. 따로 빌드하고 명령어 치는게 귀찮다면 아래와 같이 타겟을 하나 더 추가하여 스크립트를 작성하여 빌드하면 됩니다.


Aggregate Target 추가

먼저 Xcode로 해당 프로젝트를 열어줍니다. Fat Framework를 만들기 위해서 새로운 타겟을 만듭니다. 프로젝트 파일을 선택하고 왼쪽 하단에 + 버튼을 눌러서 Target 추가를 해줍니다.


Cross-platform 탭으로 가면 Other 메뉴에 Aggregate가 있습니다. 선택하고 Next를 눌러주세요. 타겟이름은 UniversalFramework로 했습니다.


왼쪽 상단에 + 버튼을 누르면 Script를 추가할 수 있는 버튼이 있습니다. New Run Script Phase를 선택해줍니다.


그리고 스크립트 창에 아래의 스크립트를 복사하여 붙여넣기 해줍니다.

여기서 SCHEME_NAME은 빌드하고자 하는 프레임워크 타겟의 이름입니다. SDWebImage iOS는 중간에 띄어쓰기가 들어가서 자꾸 에러를 뱉어내서 해당 타겟을 복사하여 이름만 SDWebImage로 변경하였습니다. 빌드하고자 하는 타겟의 이름을 적어주면 됩니다.

출처 : https://medium.com/@syshen/create-an-ios-universal-framework-148eb130a46c


빌드할 수 있도록 새로운 scheme을 추가해줍니다. 왼쪽 상단 Stop 버튼 오른쪽 프로젝트 이름을 선택하고 Manage schemes ... 를 눌러줍니다.

+ 버튼을 누르면 방금 추가한 타켓이 입력되어 있습니다. 그냥 OK눌러줍니다.


shared 체크박스를 체크해주고 닫아줍니다.


이제 새로운 타겟이 성공적으로 추가되었습니다.


Fat framework 빌드하기

혹시 i386, x86_64를 시뮬레이터를 모두 지원하기 위해서는 빌드하기 전에 한가지 더 세팅합니다. 기본 Build configuration이 debug로 세팅되어 있는데 release로 세팅해줍니다.

아까 scheme추가 한 곳 메뉴 상단에 Edit Scheme..을 눌러줍니다.


Build Configuration이 Debug로 세팅되어 있는데 Release로 변경해주고 빌드해줍니다.


Fat Framework로 빌드된 프레임워크를 확인합니다. 오른쪽 클릭 후 Show in finder를 하면 해당 경로로 이동할 수 있습니다.


file 명령어로 확인해보니 i386, x86_64, armv7, arm64를 지원하는 프레임워크가 생성되었습니다.




'개발 > iOS' 카테고리의 다른 글

UIScrollView에서 Autolayout 적용하기  (1) 2017.11.21
Fat Framework 만들기  (0) 2017.11.17
Symbol(s) not found for architecture x86_64 에러  (0) 2017.11.15

Symbol(s) not found for architecture x86_64, arm64 등 에러의 원인

  기존 회사 프로젝트가 테스트 기기에서는 잘 동작하는데 시뮬레이터에서는 동작하지 않는 문제가 있었습니다. 그래도 각자 테스트 기기가 있으니까 딱히 해결하려고 하지 않았습니다. 배포하는데 문제 없으니까요.. 그런데 이번에 iPhoneX가 나오면서 프레임이 완전히 바껴버렸어요. 이번에야 말로 시뮬레이터에서 돌아가지 않는 문제를 해결해야할 때가 온 거예요. 누군가도 이러한 문제를 겪고 있을 것 같아 포스팅 합니다.

프로젝트를 하다 보면 프레임워크, 라이브러리를 따로 빌드해서 넣을 때가 있습니다. 근데 에러가 납니다!

    • 프로젝트에 딱 복사 붙여넣기 하고 빌드 했는데 에러가 난다. 
    • 또는 테스트 기기에선 잘 돌아갔는데 Archiving을 하니까 에러가 난다, 
    • 또는 테스트 기기는 다 잘되는데 시뮬레이터에서 안 돌아간다.

    등등 ...

대략 이런 에러를 냅니다. 여기서 중요하게 봐야할 것은 "Symbol(s) not found for architecture x86_64' 라는 문구입니다. 해석해보면 SDWebImage, Zbar 등 라이브러리에 x86_64 아키텍쳐를 위한 심볼이 없다. 라는 것입니다. Xcode로 빌드할 때 어떤 Architecture를 타겟으로 빌드할지 설정합니다. 그 항목은 프로젝트 파일의 build Setting을 보면 알 수 있습니다. 


이미 빌드되어 있는 라이브러리가 어떤 아키텍쳐를 지원하고 있는지 확인하는 방법은 lipo -info 또는 file 명령어를 이용하면 됩니다.

lipo -info SDWebImage 

Architectures in the fat file: SDWebImage are: arm_v7 arm64 


기기 별로 지원하는 Architecture가 다릅니다. 간단하게 보면 아래와 같습니다.


Architecture 별 지원 기기

 ARMv7s 

 iPhone5, iPad4, iPhone5c 

 ARM64

 iPhone5s, iPad min2 . iPhone6, iPhoneX

 i386, x86_64

 맥용 (시뮬레이터) 


  위의 SDWebImage, Zbar라이브러리는  ARMv7, ARM64 아키텍쳐를 지원하도록 빌드되었습니다. 그렇다면 빌드할 때 x86_64로 빌드해서 넣어보기로 합니다. x86_64 아키텍쳐는 맥에서 사용하는 아키텍쳐입니다. 그렇다면 맥에서 돌아가는 시뮬레이터가 x86_64 아키텍쳐겠죠. 빌드할 때 타겟을 시뮬레이터로 설정하고 빌드하면 i386, x86_64를 지원하는 아키텍쳐로 빌드할 수 있습니다.

  프로젝트에 적용하고 빌드하면 시뮬레이터에서는 잘 돌아가는데 기기에서 빌드가 안되는 문제가 생깁니다. 'Symbol(s) not found for architecture arm64' 이런 에러를 냅니다. 어째튼 둘다 돌아가게 만들고 싶습니다. 그렇다면 ARMv7s, ARM64, x86_64 모두 지원하도록 빌드하면 됩니다. 다음 포스팅에 Fat Framework/Library를 빌드하는 방법을 소개하겠습니다.


'개발 > iOS' 카테고리의 다른 글

UIScrollView에서 Autolayout 적용하기  (1) 2017.11.21
Fat Framework 만들기  (0) 2017.11.17
Symbol(s) not found for architecture x86_64 에러  (0) 2017.11.15

SourceTree를 이용해 Bitbucket에 Repository 생성하기


  개인 프로젝트를 진행할 Git 솔루션으로 BitBucket을 선택했다. 오픈소스 다운로드 받으면서 많이 봤던 Github는 비공개 프로젝트는 유료다. 무료로 쓸 수 있는 원격 저장소를 검색해보아 찾아낸 것은 바로 Atlassian에서 나온 BitBucket이다. 나는 Git툴로 SourceTree를 사용하고 있다. 이것도 물론 무료

Bitbucket은 최대 5명까지의 소규모 팀에 무료로 제공되고 무제한으로 공개 및 비공개 Repository를 쓸 수 있다.. Git은 공개 리퍼지토리는 무료지만 비공개 리퍼지토리는 유료 계정을 사야하는데 매달 7$ 또는 84$ 매년을 결제해야 한다. (2017.11.17 기준)

Xcode는 Github에 계정을 연결할 수 있어서 Xcode에서 Repository를 생성할 수 있는데 BitBucket는 지원하지 않는다. Bitbucket에 Repository를 생성하려면 웹사이트에서 프로젝트 생성 후 파일을 올려도 되지만 SourceTree를 이용해서 바로 올리는 법을 포스팅하려고 한다.


일단 SourceTree를 다운받아서 계정을 연결해줍니다. SourceTree-설정-계정으로 가면 입력할 수 있어요.

상단 New..메뉴에서 로컬 저장소 추가하기를 눌러줍니다. 로컬 저장소 생성을 눌러도 무관한 것 같아요.

Algorithm01이라는 프로젝트를 올리기로 합니다. 해당 프로젝트를 Bitbucket에 올릴 목적지 경로로 선택하면 이름은 자동으로 들아가요. 유형은 Git을 선택해줍니다. 동시에 원격 저장소도 생성을 체크해주고 생성하기를 선택합니다

계정은 Bitbucket에 로그인 한 계정을 선택해주고 개인 저장소 입니다. 를 체크합니다. 그리고 생성하기를 눌러줍니다.

그리고 Bitbucket 웹페이지에 들어가면 오른쪽에 방금 생성한 Algorithm01프로젝트가 생성되어있는 것을 볼 수 있습니다.


지금까지 BitBucket을 사용해보니 불편한 점 없고 괜찮다. 개인프로젝트 진행할 땐 일단 무료로 사용할 수 있다는게 가장 큰 장점인 것 같다. Github와 Bitbucket 차이를 찾아보니 큰 차이는 없고 개인 프로젝트는 BitBucket을 추천하고 그 외에 오픈소스는 Github를 추천한다고 한다. 그 이유는 컨트리뷰터에 제한이 없고 가장 많은 유저를 가지고 있으며 Linux, jQuery등과 같은 메이져 프로젝트를 호스트하고 있다는 것이다. 어째튼 둘 다 사용하기 좋다.


'개발' 카테고리의 다른 글

SourceTree를 이용해 BitBucket에 Repository 생성하기  (0) 2017.10.19

+ Recent posts