[TIL] Inset, Offset, 레이아웃 변경 메소드

rbw·2022년 12월 4일
0

TIL

목록 보기
53/98

Inset, Offset ?

inset과 offset의 정확한 정의를 잘 모르는 느낌이라 찾아 보았다.

참조

https://minosaekki.tistory.com/36


  • Inset은 더 작은 것으로 더 큰 것이 설정되는 것(예로, 작은 사진이 큰 사진 안에 있는 것 같은)인 반면에 offset은 균형 잡힌 역할을 하게 하는 것이다.

만약, 그림자의 inset이 (-10, -10) 이라면 그림자는 해당 객체보다 10픽셀 넓고 10픽셀 높은 것이다. 음수로 넣게 되면 그림자를 크게 만들고 양수로 만들면 그림자의 크기를 더 작게 만든다.

Content Inset

  • content viewsafe area 또는 scroll view의 가장자리로부터의 inset을 의미
  • content inset은 하위 뷰 콘텐츠에 상하좌우로 빈 공간(padding)을 주는 것이다. 위에서 자기 자신의 바깥쪽이 아닌 안쪽으로 공간을 주는 것을 의미한다.
  • 예를 들어, 스크롤 뷰에 이미지 뷰를 넣고 이미지 뷰 위쪽으로 공간을 가지고 싶을 때는, 이미지 뷰에 content inset을 넣는 것이 아닌 그 상위뷰인 스크롤 뷰에 padding을 주는 것이다.
myScrollView.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

Content Offset

  • 스크롤이 가능한 컨테이너에서의 현재 오프셋을 의미한다.
  • content offset은 바운드의 origin point라고 할 수 있따. 이때 스크롤을 하는 것은 content offset이 변하는 활동을 말하게 된다. Frame 과 반대로 Bounds는 자기 자신 뷰를 기준으로 하기 때문에 가능한 것이다.
  • scrollView.contentOffset.xscrollView.bounds.origin.x와 같은 의미이다.
// 일정 스크롤을 하면 다음 데이터를 가져오는 함수
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard let page = page, !isFetching else {
        return
    }
    let threshold: CGFloat = 0.85
    let percent = scrollView.contentOffset.y / (scrollView.contentSize.height - scrollView.bounds.height)
    guard !page.last && percent >= threshold else {
        return
    }
    fetch()
}

레이아웃 변경 메소드

참조

https://velog.io/@mmim/iOS-View-Drawing-Cycle


layoutIfNeeded()

공식문서 : 레이아웃 업데이트가 보류중인 경우, 하위 뷰를 즉시 레이아웃한다.

수동으로 layoutSubviews()를 예약하는 함수, 해당 예약을 바로 실행시키는 동기적으로 작동하는 메소드, 따라서 다음 업데이트 사이클이 올 때 까지 기다리는게 아니라 즉시 layoutSubviews를 호출함

동기적인 성격 때문에 즉시 값이 변경되어야하는 애니메이션에 많이 사용한다

SetNeedsLayout()

공식문서 : 수신자의 현재 레이아웃을 무효화하고, 다음 업데이트 주기 동안 레이아웃 업데이트를 트리거 한다.

  • layoutSubviews()를 호출하기 위한 예약 방법중 비용이 가장 적게 든다.
  • 이 메소드를 호출한 뷰는 재계산 되어야 하는 뷰라고 수동으로 체크가 되며, 업데이트 사이클에서 layoutSubviews가 호출되게 된다.
  • 이 메소드는 비동기적으로 작동하기 떄문에 호출되고 바로 반환된다.
  • 뷰의 보여지는 모습은 업데이트 사이클에 들어갔을 때 바뀌게 된다.

profile
hi there 👋

0개의 댓글