[Swift5] 버튼 보이게 / 보이지 않게 하기

(Android와 비교)


iOS 앱 개발을 하다보면 버튼을 보이게 하거나 보이지 않게 해야하는 경우가 있습니다.

이런 경우 코드로는 어떻게 표현을 해야하는지를 알아보겠습니다.

 

우선 안드로이드에서 사용하는 버튼을 보이거나 보이지 않게하는 방법입니다. (setVisibility함수 사용)

 

Android에서 사용하는 방법(Java)

private Button btn_test

//init
btn_test = findViewById(R.id.btn_test);

//버튼을 보이지 않게
btn_test.setVisibility(View.INVISIBLE);

//버튼을 보이게
btn_test.setVisibility(View.VISIBLE);

 

iOS에서는 @IBOutlet으로 Storyboard에서 간단하게 드래그로 변수 선언을 해주시고, layer의 isHidden을 이용해 컨트롤합니다.

 

iOS에서 사용하는 방법입니다.(Swift5)

@IBOutlet weak var btn_test: UIButton!

//버튼 보이지 않게
btn_test.layer.isHidden = true

//버튼 보이게
btn_test.layer.isHidden = false

 

단, 위 코드는 UIBarButtonItem 컴포넌트에서는 먹히지 않습니다. (layer가 선언이 되는 컴포넌트는 전부 가능 - Button, View 등)

 

컴포넌트가 UIBarButtonItem인 경우(Swift5)

@IBOutlet weak var navigation_btn_test: UIBarButtonItem!

//버튼 보이지 않게
navigation_btn_test.isEnabled = false
navigation_btn_test.tintColor = UIColor.clear

//버튼 보이게
navigation_btn_test.isEnabled = true
navigation_btn_test.tintColor = UIColor.black

 

UIBarButtonItem 컴포넌트의 경우 아무래도 isHidden을 사용할 수 없는 모양입니다.

(객체 내에서 Hidden을 시킬 수 있는 함수나 멤버가 없는 모양)

따라서 위의 소스는

1. 버튼을 사용하지 못하게 막음.

2. 색상을 없애버려 없는 버튼처럼 만들어 줌.

두가지를 이용했다고 보시면 됩니다.

 

단, 이는 제가 아직 부족한 부분이 많아서 다른 좋은 방법이 있을 수 있으므로, 좋은 방법이 있다면 업데이트 해두도록 하겠습니다.

(소스의 표현방식은 각양각색이니까요!)

 

 

테스트 장비 : 맥미니(2020)

 

버전정보 (v1.0)

 - v1.0 2020.07.01 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com


[Xcode] sotryboard에 UI Component 추가하기


솔직히 이건 아실분들은 다 아시겠지만..

Xcode 10부터는 UI Component의 위치가 달라졌습니다.

(저는 이거 몰라서 헤맸다죠 ㅋㅋㅋㅋㅋㅋ)

 

예전엔 분명 우측 하단에 존재했을 UI Component의 위치가 이제는 우측 상단 + 버튼으로 변경되었습니다.

(간만에 iOS개발하느라 바뀐걸 몰랐...)

 

- UI Componet 버튼의 위치

 -> 우측 상단 + 버튼을 찾아보세요. 아래 이미지의 파란색 상자

UI Component는 우측 상단의 + 버튼으로 변경되었습니다.

 

- UI Component 추가하는 방법

 -> 예전처럼 추가하기 원하시는 Component를 마우스로 클릭하신 상태로 드래그 해주시면 됩니다.

Label, Button 등 원하시는 Component를 클릭해서 그대로 드래그하시면 됩니다.

 

예시) Label 추가

Label을 추가한 화면

 

사실 다들 숙지하고 계시리라고는 생각하는데, 저처럼 간만에 Xcode를 만지거나, 옛날 책으로 Xcode에 입문하시는 분들이 아까운 시간을 버릴까봐 작성해봤습니다.

(이러는 저도 저거 하나 찾겠다고 진짜로 뻥아니고 몇십분 날려먹었습..)

 

테스트 장비 : 맥미니(2020)

 

버전정보 (v1.0)

 - v1.0 2020.07.01 배포

 

* 본 게시글의 이미지 및 사진의 출처는 전부 작성자 본인이 직접 제작 및 촬영하였습니다.

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com


[Mac]맥미니(2018-2020) 기본형으로 개발하기 괜찮을까?


우선 결론부터 먼저 말씀드리면 충분합니다.

 

얼마전 맥미니 구입 게시글을 작성하고 블로그 검색 키워드를 찾아보니 '맥미니 기본형 개발'이 눈에 보이더군요.

아무래도 가격대가 높은 맥북 시리즈보다는 맥미니를 알아보고 계신분들이 많은 모양입니다.

저 또한 마찬가지였고, 맥미니 기본형에 들어간 CPU자체도 i3지만 쿼드코어이다보니 쓸만해서 맥미니 기본형으로 선택했습니다.

 

- 스펙정보

 - CPU : i3 (8세대)

 - RAM : 8GB

 - SSD : 256GB

 

구매사유

추가로 저에게는 맥북 프로 13인치 (2012), 맥북 에어 13인치 (2013)을 가지고 있습니다.

맥북프로 13인치는 기본형으로,

맥북에어 13인치의 경우 CTO로 CPU를 i7으로 올렸으며, RAM은 8기가를 가지고 있습니다.

 

두 제품 모두 Xcode를 못돌릴 정도는 아니지만, 에뮬레이터는 정말 커피나 차 한잔 타와야할 수준으로 기다려야하고,

무엇보다 화면이 작고 해상도가 낮다보니 코딩으로는 어려운면이 많이 있습니다.

 

때문에 많은 고민 끝에 맥미니 기본형의 구매를 결정했습니다.

 

개발을 해보면서

맥미니 기본형에서 Xcode를 돌려본 결과 확실히 빠른 속도를 느낄 수 있고,

특히 에뮬레이터는 몇초만에 구동되는 모습을 눈으로 확인할 수 있었습니다.

(맥북에어 13인치의 경우 체감상 몇분 걸리는 느낌)

또한 모니터 3대까지 연결이 가능해 (저는 기본적으로 모니터 3대를 이용중에 있습니다. - 윈도우, 개인 리눅스 서버 함께)

맥북 에어나 프로에서 노트북 모니터 1대 외에 추가로 1대(썬더볼트 사용)를 연결할 수 있다면 큰 화면3대는 나름 개발에 있어서 중요한 이점이기도, 큰 메리트이기도 합니다.

 

구매시 팁 (Tip) 

* 개인적인 생각입니다. 각자 자신만의 취향이 있으실테니, 참고용으로만 읽어주세요!

 

CPU 추천 - i3 (기본)

알아본 결과로는 인텔 CPU 8세대 제품들이 워낙 뜨겁다보니 맥미니에서도 발열을 잡기가 어려웠다는 평이 많습니다.

그러다보니 적재적소라고 타 블로그에서도 i3를 많이 추천해주더라구요.

개발에도 큰 문제가 없으며, 특히 발열생각하면 i3가 가장 낫다는 평입니다.

무엇보다 한단계 위인 i5로 올리고 큰 작업이 있으면 쓰로틀링이 심해 i3보다 오히려 좋지 못한 성능을 낸다는 평까지 보였습니다.

물론 코어가 많으면 많을수록 좋겠지만, i3도 쿼드코어로 어느정도 헤비한 작업도 충분하며, 사용자가 원하는 성능은 충분히 뽑아준다고 보시면 되겠습니다.

여담이지만 개인적으로 i5 8세대 윈도우 태블릿을 사용중에 있지만, 진짜 뜨겁습니다. 뜨거워지면 쓰로틀링 당연히 걸리구요......

 

RAM 추천 - 8GB (기본)

어쩌다보니 CPU 다음으로 RAM까지 기본으로 추천해드리게 되네요.

RAM을 기본형으로 가는 큰 이유중 하나는 맥미니(2018-2020) 모델의 경우 RAM의 확장이 가능합니다!

자신이 컴퓨터를 어느정도 케어가 가능하다면 기본형으로 구입하셔서 추후 RAM을 추가 확장하시는걸 추천드립니다!

인터넷을 잘 활용하시면 램 교환방법이 많이 나와있어서 차근차근 작업하시다보면 RAM확장도 어렵지 않게 가능하시리라 봅니다.

(저는 추후 16GB로 업그레이드 할 생각입니다. 32GB는 의미없다 생각하고 있구요. - 다다익램도 적당히.._저의 사용패턴에 맞춰서 고려한겁니다.)

* 물론 맥미니를 분해하면 워런티(보증기간)가 깨질겁니다. 그렇기 때문에 신중하게 선택을 하시고, 애플케어 가입하시려면 처음부터 업그레이드를 하시거나, 애플케어 기간이 끝나고 업그레이드 하심을 추천드립니다. 솔직히 애플케어 하시는 분들은 그냥 공홈에서 업그레이드 추천드립니다. (자신의 상황에 따라 업그레이드 하시면 될 것 같습니다!)

* 추가로 사용하시는 분들에 따라 분해과정이 난해(어려울 수)하실 수 있으니, 고민되시는 분들은 그냥 공홈을 통한 업그레이드를 추천합니다. (특히 만졌다하면 고장나는 그런분들..)

 

SSD 추천 - 512GB (한단계 업!)

대세는 512GB입니다! 

우선 말씀드리지만, 맥미니(2018-2020)의 경우 SSD의 업그레이드가 불가능합니다. (납땜되어 있음)

업그레이드가 불가능 하다보니 추후에 용량이 부족할 때 난처한 상황이 발생할 수 있습니다!

때문에 개발용으로 쓰신다면 그만큼 프로젝트에 많이 사용하시게 될 것 같으니 256GB보다는 512GB를 추천드립니다.

추가로 저는 기본형인 256GB 용량으로는 많이 아쉽다고 보고 있고 (윈도우도 256GB 금방씁니다..),

지금 사용중인 맥미니는 256GB이지만, 512GB를 살껄 하는 생각도 있었습니다.

다만, 저의 경우 언젠가 제가 가진 맥북 프로 (2012)를 업그레이드 해야지 싶은 생각이 있어서 256GB로 두었습니다.

한가지 말씀드리자면, 저의 경우 윈도우도 이래저래 설치만해도 256GB는 금새 쓰는 타입이라서 512를 추천해드리고 있습니다.

개발 때문에 사용하는 IDE(설치용량이 무식함)나 프로젝트 공간(프로젝트 년단위로 10개씩만 나와도..)만으로 엄청 사용합니다.

하지만! 자신이 윈도우 PC에서 256GB로 충분하고 남았다! 싶으시다면 256GB로도 충분하시리라 생각합니다.

또한 외장하드 등 용량 운용에 자신이 있으시다면 256GB로 충분할 것 같습니다.

여유가 있으시다면 그냥 1테라로..

 

결국 구매는 자기의 선택이라 봅니다.

때문에 제가 쓴 글은 참고용으로만 생각하시고 구매하시면 좋을 것 같습니다!

 

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin




[Swift5] intro 화면 만들기

LaunchScreen.storyboard에서 x초간 딜레이 주기


어플을 만들다보면 초기화면에서 x초간 딜레이 후 메인화면으로 이동하는 경우가 있습니다.

 

그런 경우에는 여러 방법이 있겠지만,

제가 사용하는 방법은 LaunchScreen.storyboard에서 1초정도 딜레이를 주는 방법을 사용하고 있습니다.

 

1. LaunchScreen.storyboard 작업

LaunchScreen.storyboard 클릭

 1.1. ViewController에 원하는 로고 등 작업을 합니다.

Image View를 추가한다던가 작업을 진행합니다.

 

2. AppDelegate.swift 작업

AppDelegate.swift 클릭

 2.1. // Override point for customization after application launch 주석을 찾고, 해당 주석 아래에 sleep(1); 코드를 추가

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        sleep(1)
        return true
    }

  --> sleep 함수는 파라미터로 받아온 시간동안 딜레이를 생성 시켜주는 함수입니다. 여기서는 1을 넣었으니 1초가 됩니다.

 

3. 실행 

 --> 실행을 해보시면 1초간 LaunchScreen.storyboard의 내용이 나오고 이후 Main.storyboard로 넘어감을 확인할 수 있습니다.

 

 

 

테스트 정보

 - 맥 미니 (2020) - iPhone SE (1st Gen)

 

버전정보 (v1.0)

 - v1.0 2020.06.30 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com



 


[Xcode] 아이폰에서 앱 실행 안되는 문제 해결

 - Could not launch "프로젝트 명"


 

아이폰 에뮬레이터에서 잔뜩 테스트를 진행하다가 실제 아이폰에서 구동을 시킬때 구동이 안될 수 있습니다.

대략 그 느낌은 아래와 같이

더보기

Could not launch "프로젝트 명"

iPhone has denied the launch request.

Internal launch error : ~~~ (길어서 생략)


해결 방법입니다.

아이폰 작업

아이폰-맥 연결 -> 신뢰 -> 암호입력 -> 

신뢰를 하고 암호를 입력합니다.

 

맥 작업 (Xcode)

프로젝트 Run ->  다시한번 Could not launch "프로젝트 명" ->

아이폰 작업

설정 -> 일반 ->

일반 터치

기기관리 ->

기기 관리 터치

개발자 앱 밑에 Apple Development : 애플아이디 ->

Apple Development: 터치

파란색 애플아이디 부분 터치 -> 

파란색 글자(Apple Development: ~) 터치

~앱을 신뢰함 : 신뢰 ->

앱 신뢰

맥 작업 (Xcode)

프로젝트 Run ->

아이폰 작업

앱 실행 및 확인

 

위 작업 한번만 해주시면 연결하신 맥과 아이폰은 계속해서 테스트가 가능합니다.

다만, 새로운 맥에 연결하시는 경우에는 위 작업이 다시 필요하니 잘 숙지해두시면 좋을 것 같습니다.

 

테스트 정보

 - 맥 미니 (2020) - iPhone SE (1st Gen)

 

버전정보 (v1.0)

 - v1.0 2020.06.29 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com

 


[AndroidStudio] Unsupported Modules Detected 에러 해결


Unsupported Modules Detected: Compilation is not supported for following modules: [프로젝트 명] Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.


안드로이드 스튜디오에서 프로젝트 빌드를 했더니 이벤트 로그에 다음과 같은 에러가 났습니다.

더보기

Unsupported Modules Detected: Compilation is not supported for following modules: [프로젝트 명] Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.

 

아래는 위 에러에 대한 해결 방법입니다. 저는 아래 방법으로 해결 되었습니다.(안드로이드 스튜디오 3.6.2 기준) - Stack overflow 참조 (링크)

1 - 프로젝트를 닫습니다.

2 - 안드로이드 스튜디오 IDE를 닫습니다.

3 - .idea 폴더를 삭제합니다. (프로젝트 위치에 있는 .idea 폴더입니다.)

4 - 모든 .iml 파일을 삭제합니다. (프로젝트 위치에서 .iml 파일을 검색하여 나오는 파일들 전부 삭제하면됩니다.)

5 - 안드로이드 스튜디오를 열고 프로젝트를 import해줍니다.

 


 

위 방법으로 해결이 안된다면, 스택오버플로에 있는 다른 해결방법입니다.

프로젝트 내 setting.gradle로 이동합니다.

--

include ':app'

rootProject.name='<~~~>'  // 제거

--

위 내용에서 rootProject.name='<>' 를 제거해줍니다.

그리고 상단에 나오는 Sync Now 클릭

 

참조

https://stackoverflow.com/questions/30142056/error-unfortunately-you-cant-have-non-gradle-java-modules-and-android-gradle

 

Error: Unfortunately you can't have non-Gradle Java modules and > Android-Gradle modules in one project

I have an IntelliJ 14.1.2 Project consisting of two modules - one is an Android Gradle based module and the other is a Spring Java-based module with Maven. gps-trackman.v1 is my root project and I...

stackoverflow.com

 

버전정보 (v1.0)

 - v1.0 2020.06.29 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com


[Java] Activity 화면 방향 회전시 제어하기 (Sensor옵션)


 

지난 시간에 Activity 화면의 방향을 제어하는 방법에 대해서 알아보았습니다. (링크)

 

여기서는 sensor옵션 관련(sensor, fullsensor, sensorLandscape, sensorPortrait) 옵션을 주고 회전시에 화면을 제어하는 방법에 대해서 알아보도록 하겠습니다.

 

Manifest에서 화면의 방향을 제어할 옵션을 준 Activity Class에서 onCreate 함수에

displayManager를 선언해 Listner를 등록해주면 됩니다.

아래는 DisplayManager를 선언하고 Listener를 등록해주는 소스

DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
displayManager.registerDisplayListener(displayListener, null);

 

위 소스를 입력하시면 displayListener가 없다고 에러가 날겁니다.

아래는 우리에게 필요한 Listener(displayListener)를 생성합니다.

DisplayManager.DisplayListener displayListener = new DisplayManager.DisplayListener() {
  @Override
  public void onDisplayAdded(int displayId) {
  	//디스플레이가 시스템에서 추가될 때
  }

  @Override
  public void onDisplayRemoved(int displayId) {
  	//디스플레이가 시스템에서 삭제될 때
  }

  @Override
  public void onDisplayChanged(int displayId) {
  	//디스플레이가 변경될때마다
  }
};

위 선언된 Listener에서 내부 Override된 onDisplayChanged 함수를 이용하시면 Activity가 회전될 때마다 캐치하여 원하는 소스를 실행할 수 있습니다.

 

참조

https://developer.android.com/reference/android/hardware/display/DisplayManager.DisplayListener

 

버전정보 (v1.0)

 - v1.0 2020.06.27 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com

 


[Kotlin, Java] Activity 화면 방향 설정


안드로이드의 Activity 설정 시 Orientation을 지정하는 방법을 설명합니다.

 

AndroidManifest.xml에 Orientation 설정을 바꿀 Activity에 대해 특성 한가지만 추가(수정)해주면 됩니다.

 - android:screenOrientation = "옵션값"

  -> screenOrientation 특성은 Activity의 방향을 설정할 수 있습니다.

  -> 단, Activity가 다중창모드(멀티태스킹, 화면 분할)로 실행이 된다면 이 특성은 무시됩니다.

  -> 옵션값 (자주 사용할만한 옵션값에는 Bold 처리)

 

unspecified behind landscape portrait
reverseLandscape reversePortrait sensorLandscape sensorPortrait
userLandscape userPortrait sensor fullSensor
nosensor user fullUser locked

 

-> 자주 사용하는 옵션값만 설명을 하자면,

 landscape는 Activity를 가로방향으로 고정합니다.

 portrait는 Activity를 세로방향으로 고정합니다.

 sensorLandscape는 Activity를 가로방향으로 고정을 하고, sensor의 값에 따라 반전이 될 수 있습니다.

 sensorPortrait는 Activity를 세로방향으로 고정을 하고, sensor의 값에 따라 반전이 될 수 있습니다.

 sensor의 경우 사용자가 들고있는 방향에 따라 Activity의 방향이 결정됩니다.

  -- sensor 사용시 4방향에 대한 설정이 이루어지지 않는다면 fullSensor를 사용해 보세요.

 

 - AndroidManifest.xml에서 설정하는법.

방향 설정을 원하는 Activity 설정 안에 android:screenOrientation 특성을 주어 원하는 옵션값을 부여합니다.

(원하는 옵션값은 상단에서 선택합니다.)

* Android Studio 3.6 이상에서는 사용자가 screenOrientation을 지정하면 에러를 낼 수 있습니다.

 - 이는 unspecified(default -> 시스템이 방향을 선택)와 fullSensor 이외의 옵션값을 사용할 때 일어나는 문제로, tools:ignore="LockedOrientationActivity" 특성과 옵션값을 주어 에러를 무시할 수 있습니다.(오류 무시)

 

<activity
  android:name=".MainActivity"
  android:screenOrientation="portrait"
  tools:ignore="LockedOrientationActivity">
</activity>

 

참조

https://developer.android.com/guide/topics/manifest/activity-element?hl=ko

 

<액티비티>  |  Android 개발자  |  Android Developers

Declares an activity (an Activity subclass) that implements part of the application's visual user interface. All activities must be represented by {@code } elements in the manifest file. Any that are not declared there will not be seen by the system…

developer.android.com

 

버전정보 (v1.0)

 - v1.0 2020.06.26 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com




+ Recent posts