카테고리 없음

202208026이종윤 iOS 11주차 과제

jong133 2026. 5. 18. 16:33

애플에서 기기마다 같은 동작을 하게끔 만드는것이 오토레이아웃이있고 사진과같이 5가지 방법이있다. 초보자들이 의외로 많이 실습을해야되서 어려운 스토리보드 기반으로 스택뷰를 쓸것이다. 초보때 제일 먼저 배우는 방식 스토리보드

 

NSLayoutAnchor란? 오토레이아웃에서 뷰의 위치와 크기를 앵커(기준점) 기반으로 제약 조건을 거는 방식입니다. 코드로 레이아웃을 잡을 때 가장 많이 쓰입니다.

NSLayoutAnchor를 이용한 오토레이아웃

visualize
 

V

visualize show_widget
 
 

NSLayoutAnchor란?

오토레이아웃에서 뷰의 위치와 크기를 앵커(기준점) 기반으로 제약 조건을 거는 방식입니다. 코드로 레이아웃을 잡을 때 가장 많이 쓰입니다.


예시: 버튼을 화면 정중앙에 배치

 
 
swift
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.setTitle("로그인 버튼", for: .normal)
        view.addSubview(button)

        // ⚠️ 이 한 줄 필수! 없으면 제약이 무시됨
        button.translatesAutoresizingMaskIntoConstraints = false

        // 가로 중앙 정렬
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        // 세로 중앙 정렬
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        // 너비 고정
        button.widthAnchor.constraint(equalToConstant: 150).isActive = true
        // 높이 고정
        button.heightAnchor.constraint(equalToConstant: 66).isActive = true
    }
}

주요 앵커 종류

앵커의미
centerXAnchor 가로 중앙
centerYAnchor 세로 중앙
widthAnchor 너비
heightAnchor 높이
topAnchor 위쪽 가장자리
leadingAnchor 왼쪽 가장자리

translatesAutoresizingMaskIntoConstraints = false는 코드로 오토레이아웃을 쓸 때 반드시 설정해야 합니다. 빠트리면 제약 조건이 충돌해서 레이아웃이 깨집니다.

 

 

오토레이아웃을 하기 힘든데 개를 쉽게하게 하기위해 해커가 만들어논 라이브러리이다. 실무에서 가장많이 쓰는 라이브러리중에 하나이다.
실행결과
안녕하세요! 버튼과 버튼 눌러보기 버튼이 이렇게 나온다.

 

 

UIKit vs SwiftUI 비교

UIKit (오토레이아웃)SwiftUI
translatesAutoresizingMaskIntoConstraints = false 없음 (자동)
centerXAnchor.constraint(equalTo:...) VStack, HStack 으로 배치
widthAnchor.constraint(equalToConstant: 150) .frame(width: 150)
topAnchor.constraint(equalTo:..., constant: 16) .padding(.top, 16)

SwiftUI는 제약 조건을 직접 걸지 않고, 컨테이너(VStack, HStack, ZStack) 안에 뷰를 선언하는 것만으로 레이아웃이 자동으로 잡힙니다. 코드가 훨씬 짧고 직관적인 게 가장 큰 차이점입니다.

허밍은 늘리고싶지 않는 특징 컴프래션은 줄어들기싶지 않는 특징이다. Content Hugging 및 Content Compression Resistance Priority  뷰의 크기가 내용에 어떻게 맞춰져야 하는지를 결정  Content Hugging : 내 크기를 더 크게 늘리고 싶지 않아!  Content Compression Resistance : 내 크기를 더 줄이고 싶지 않아! <-시험에 무조건나옴
제일 오른쪽 아이콘을 클릭하면 이런 창이 뜨는데 이거는 스택뷰이다. 가장 많이 쓸 것이다.
오른쪽위에 삼각형으로 되있는게 사이드 인스펙터
750,250, 1000 내가 직접 잡으면 우선순위가 높다. 압축해서 내용이 안보이게하는것은 안되니까 내용이 보일때까지만 압축해라해서 750이고 허깅은 251정도 되는것이다.
이 콘텐츠의 크기를 고유 콘텐츠 사이즈라고 함
허킹은 늘어나지 않을려고하는것이고 컴프레션 레지스턴스는 쭐어들지 않을려고 하는것이다. 그래서 이런애를 컨스트레인트를 높게 주면 된다.
스택뷰는 정렬과 배분과 간격만 알고있으면된다. 정렬은 Alignment 배분은 distribution 간격은 spacing
수동으로 사이즈를 줄이면은 왼쪽에 노란 화살표가 뜨며 그거를 클릭시 에메하는식의 경고창이 뜬다.
자동으로 문제를 해결해주는 기능이 우주선 같이 생긴모양이다.
레이블 두개를 스택뷰에다가 넣었는데 위아래로 되있어서 버티컬이 axis로 값이 되어있다.
지금 원래 왼쪽에 있는 레이블 두개를 h스택뷰를해서 넣어놨다. 제일 바깎쪽에 있는것이 h스택뷰고 안쪽에 있는것은 수직 스택뷰이다. 레이블 두개를 추가하여 일정한 간격으로 스택뷰를 지정하고 그다음에 전체를 스택뷰를 한것이다.
Autoshrink로 minimum font scale을 지정하면 0.5가 디폴트 값으로 나오는데 이값은 원래의 폰트 사이즈 22에서 0.5를 곱한값으로 결과가 나온다고 하면되고 바로 밑에칸에 미니멈 폰트 사이즈는 11로 디폴트가되있는데 그냥 11로 줄이겠다는 이야기이다.
이렇게 순위랑 누적 : 어제 :도 표기하게 만들어보았다.
앱 아래에 내가 만들었다는 글짜와 위쪽에 제목을 적어보았다. tit만 쓰면은 저렇게 타입형들이 나와서 골라 원하는대로 소스를 짜면 된다.

 

if let aCnt = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiCnt { let numF = NumberFormatter() numF.numberStyle = .decimal let aCount = Int(aCnt)! let result = numF.string(for: aCount)! + "명" cell.audiCount.text = "어제 : \(result)" } 이 부분을 설명해줘

오후 4:44
 

코드 설명

전체 목적

관객수 숫자("82482")를 천 단위 콤마 형식("82,482명")으로 변환해서 셀에 표시


한 줄씩 분석

 
swift
if let aCnt = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiCnt {
  • movieData가 nil이 아닐 때만 안으로 진입 (옵셔널 바인딩)
  • 해당 row의 audiCnt 값을 aCnt에 꺼냄
  • aCnt는 현재 문자열 타입 (예: "82482")

 
swift
let numF = NumberFormatter()
numF.numberStyle = .decimal
  • NumberFormatter : 숫자를 원하는 형식의 문자열로 바꿔주는 도구
  • .decimal : 천 단위마다 콤마를 찍는 형식
    • 예) 82482  "82,482"

 
swift
let aCount = Int(aCnt)!
  • 문자열 "82482" → 정수 82482 로 변환
  • Int()는 실패할 수 있어서 옵셔널 반환 → !로 강제 언래핑
    • ⚠️ API 데이터가 항상 숫자라는 확신이 있을 때만 ! 사용

 
swift
let result = numF.string(for: aCount)! + "명"
  • numF.string(for:) : 숫자를 콤마 형식 문자열로 변환
    • 82482  "82,482"
  • 뒤에 "명" 문자열을 붙임
    • "82,482"  "82,482명"

 
swift
cell.audiCount.text = "어제 : \(result)"
  • 문자열 보간으로 최종 결과를 셀 레이블에 표시
    • 최종 결과: "어제 : 82,482명"

전체 변환 흐름

 
"82482"  (String, API 원본)
  ↓  Int(aCnt)
82482    (Int)
  ↓  numF.string(for:)
"82,482" (String, 콤마 포맷)
  ↓  + "명"
"82,482명"
  ↓  "어제 : \(result)"
"어제 : 82,482명"  ← 셀에 표시

 

MovieLJY 3.zip
0.07MB