본문 바로가기

iOS (스파르타)

계산기 앱 과제

Level 1

ㅋㅋ 레벨1만 수월했네요

1 만들고 혼자 뿌듯해하고 2 들어가고,,,

숙연

 

Level 2

근데 레벨 구현에서 조건이 헷갈리는게 분명 

layer.cornerRadius = 40

이게 주어졌는데, 예시사진에는 네모난 버튼이라 동그랗게 하는건 빼줬다 ㅎ

 

 

UIButton에 font 를 넣을 때 UILabel 때처럼

button.font = .boldSystemFont(ofSize: 30)

이렇게 하는 줄 알았는데 아니었다.

 

UIButton 클래스의 폰트 속성은 titleLabel프로퍼티를 통해 접근해야 한다.

그래서

button.titleLabel?.font = .boldSystemFont(ofSize: 30)

이렇게 작성을 해준다.

 

 

private func makeHorizontalStackView(_ views: [UIView]) -> UIStackView {
        let stackView = UIStackView(arrangedSubviews: views)
        stackView.axis = .horizontal
        stackView.backgroundColor = .black
        stackView.spacing = 10
        stackView.distribution = .fillEqually
        return stackView
    }

axis: 방향

   vertical, horizontal

spacing: subview들 간의 간격

distribution: 스택뷰 내에 배치된 subview들의 크기와 배치를 어떻게 분배할지를 결정하는 속성

  fill: 기본값으로, 가능한 모든 공간을 서브뷰에 할당한다. 서브뷰의 크기는 스택뷰의 크기에 따라 변경될 수 있다.

  fillEqually: 모든 서브뷰가 동일한 크기를 갖도록 한다. 서브뷰의 크기는 스택뷰의 크기와 서브뷰의 개수에 따라 결정된다.

  fillProportionally: 서브뷰들의 크기를 비율에 맞게 조정한다. 각 서브뷰의 고유 크기 비율에 따라 크기가 결정된다.

  equalSpacing: 서브뷰 간의 간격이 동일하게 유지된다. 서브뷰들의 크기는 고유 크기를 유지하면서 간격만 조정된다.

  equalCentering: 서브뷰들의 중심 간 간격이 동일하게 유지된다. 서브뷰들의 크기는 고유 크기를 유지하면서 간격만 조정된다.

 

makeHorizontalStackView(_:) 메서드를 viewDidLoad()에 직접 넣지 않는 이유는 코드의 가독성, 유지보수성, 그리고 재사용성을 높이기 위해서이다. viewDidLoad() 에서 호출되는 addStackViews() 메서드 내에서 makeHorizontalStackView(_:) 가 사용되고 있다. 이를 통해 코드가 더 모듈화되고 이해하기 쉽게 작성되었다.

 

Level 3

 

let stackViews = stride(from: 0, to: buttons.count, by: 4).map { i in
    makeHorizontalStackView(Array(buttons[i..<min(i + 4, buttons.count)]))
}

// stride를 사용해서 4개씩 잘라서 makeHorizontalStackView메서드로 넘김

 

stride(from:to:by:) 함수는 주어진 범위에서 일정한 간격으로 값을 생성하는 시퀀스를 만든다.

- from: 시작 값. 여기서는 0

- to: 끝 값(포함되지 않음). 여기서는 buttons.count

- by: 간격 값. 여기서는 4

 

map 함수는 시퀀스의 각 요소에 대해 주어진 클로저를 적용하고, 그 결과를 새로운 배열로 반환한다.

{ i in
    makeHorizontalStackView(Array(buttons[i..<min(i + 4, buttons.count)]))
}

이 클로저는 stride가 생성한 각 인덱스 i에 대해 다음을 수행한다.

buttons[i..<min(i + 4, buttons.count)]

- i..<i + 4: i부터 i + 4 직전까지의 범위를 나타냅니다. 예를 들어, i가 0이면 0..<4, i가 4이면 4..<8이 됩니다.

  - min(i + 4, buttons.count): i + 4가 buttons.count를 초과하지 않도록 합니다. buttons 배열의 범위를 벗어나지 않게 하는 안전장치입니다.

결과적으로, 버튼 배열의 부분 배열을 만듭니다. 예를 들어, i가 0일 때 buttons[0..<4]는 buttons 배열의 첫 4개 요소를 포함합니다.

 

Array(...)

위에서 생성된 부분 배열을 Array로 변환합니다. Swift에서 범위로 인덱싱한 결과는 배열이 아니라 서브시퀀스이므로, 이를 명시적으로 배열로 변환합니다.

makeHorizontalStackView(...)

위에서 생성된 부분 배열을 makeHorizontalStackView 함수에 전달하여 수평 스택 뷰를 만듭니다.

 

// 수평 스택뷰를 뷰에 추가하고 제약조건을 설정

for (index, stackView) in stackViews.enumerated() {
    view.addSubview(stackView)
    stackView.snp.makeConstraints {
        $0.height.equalTo(80)
        $0.leading.equalToSuperview().offset(30)
        $0.trailing.equalToSuperview().offset(-30)
        $0.top.equalTo(label.snp.bottom).offset(50 + (90 * index))
    }
}

enumerated()

배열의 각 요소와 그 요소의 인덱스를 튜플로 반환한다. stackViews 배열의 각 요소와 그 인덱스를 가져온다.

 

conerRadius 40 으로 한번 해봤는데

이거 뭔가 이상하게 보이는건 나뿐,,?;;

몬가 위아래로 뾰족한거같은데,,,

너무 거슬리는데...

 

38로 바꿔봤더니 몬가 동글하면서 살짝 옆면이 일자 같기도하고,,,,

맘에 안들어요,,;

 

'iOS (스파르타)' 카테고리의 다른 글

Swift Playgrounds 코딩 배우기 1  (0) 2024.06.25
Swift Playgrounds 코드 시작하기  (0) 2024.06.25
야구게임 과제의 과정..  (0) 2024.06.13
공부 관련 사이트,, ~ing  (0) 2024.06.12
링크드 리스트  (0) 2024.06.11