[문제해결] UITableViewCell 셀 내부 제스처가 스크롤을 막는 문제 해결: UIGestureRecognizerDelegate 활용
·
📱 iOS/UIKit
문제상황개요테이블뷰 델리게이트가 제공해주는 Trailing Swipe를 사용하지 않고 위처 커스텀 테이블뷰 셀 안에 있는 뷰에 팬제스쳐를 넣었다.그랬더니 셀의 개수가 많아져서 세로 스크롤이 되어야 할 때에 스크롤이 되지 않는 문제가 발생했다.ㄴㅇㄱ 코드는 위와 같다. 셀 안에 Pan Gesture를 넣었더니 테이블 뷰에서 셀 안에 있는 팬제스쳐에게 이벤트를 뺏겨 세로 스크롤이 되지 않는 문제가 발생했다.문제해결아이디어세로 스크롤은 컬렉션뷰의 기본 동작이지만, 셀 내부 제스처가 우선순위를 가지며 충돌 발생했다.즉, 제스쳐를 관리하는 UIGestureRecognizerDelegate 프로토콜을 활용해 제스처 동작 조건을 제한한다.수평 스와이프는 셀의 커스텀 동작으로, 수직 스와이프는 컬렉션뷰 스크롤로 이벤트..
[문제해결] UITableViewCell에서 CornerRadius 개별 설정 시 초기 레이아웃 문제를 비동기 재귀로 해결하기
·
📱 iOS/UIKit
문제상황   어느 날, 아래의 디자인 요구사항이 들어왔다.“Corner Radius를 왼쪽 위와 아래는 2로, 오른쪽 위와 아래는 8로 해주세요.”(위 영상은 눈에 잘 보이라고 왼쪽 위-아래 12, 오른쪽 위-아래 32로 설정했다.) 이전 편에서 썼듯이 CACornerMask와 UIBezierPath, CAShapeLayer를 통해 개별처리를 할 수 있다는 것을 알았다.근데 셀 안에 들어가니까 얘기가 달라졌다.해결과정1. 생성자 시점에서 configureCornerRadius() 호출뷰가 그려질 때 처음부터 잡히면 좋겠거련만, 그게 잘 안된다.코드는 다음과 같다.final class TimeSlotTableViewCell: UITableViewCell { override init( st..
[UIKit] 뷰의 Corner Radius 각각 다르게 처리하기 (with CACornerMask, UIBezierPath, CAShapeLayer)
·
📱 iOS/UIKit
학습 개요디자인 요구사항에 따라 Corner Radius 설정을 하나의 뷰에 별도로 처리해줘야 할 일이 생겼다.왼쪽 위-아래는 2로, 오른쪽 위-아래는 8로 설정해야 한다.let view = UIView()view.layer.cornerRadius = 8우리는 이런 식으로 UIView가 갖는 CALayer 타입 프로퍼티 layer에 cornerRadius로 설정해왔다.위 코드의 경우 해당 뷰는 8의 곡선을 가질 것이다.근데 각각 처리하려면 어떻게 할까 ?학습 정리CACornerMaskCALayer에 CACornerMask라는 옵션이 있다.이걸로 4개의 꼭짓점을 가리키고, 개별적으로 설정해줄 수 있다.만약 위처럼 내가 MaxX, MaxY에 대해서 설정을 했다면, 우측하단 해당 부분에만 Radius에만 적용..
[UIKit] UIMenu 사용기
·
📱 iOS/UIKit
문제 상황버튼을 클릭했을 때, UIMenu를 띄워봅시당문제 해결UIButton의 menu/// An optional menu for the button to display. The button will automatically enable or disable its contextMenuInteraction when a non-nil or nil menu is set. Defaults to nil.@available(iOS 14.0, *)@NSCopying open var menu: UIMenu?UIButton에는 Menu라는 프로퍼티가 있다.iOS 14버전 이상부터 쓸 수 있음 !! dropDownButton.menu = UIMenu( title: "", children: [ UI..
[UIKit] CollectionViewCell 드래그 앤 드랍 구현하기
·
📱 iOS/UIKit
문제 상황컬렉션 뷰의 셀들을 드래그 앤 드랍해야 할 일이 생겨서이에 대한 공부를 하고 정리해보려 한다 !문제 해결주요 메소드우리는 아래의 두 델리게이트 프로토콜을 사용할 것이고,델리게이트에서 총 3개의 메소드를 사용하여 드래그 앤 드랍을 구현할 거다.UICollectionViewDragDelegateUICollectionViewDropDelegate시작: collectionView(_:itemsForBeginning:at:)먼저 Drag 델리게이트의 메소드이다.처음 드래그가 시작될 때 호출되는 메소드로 말 그대로 “드래그”를 시작할 때 동작한다.중간: collectionView(_:dropSessionDidUpdate:withDestinationIndexPath:)Drop 델리게이트의 메소드이다.드래그 ..
[UIKit] iOS 15.0 이상에서 UIButton 안에 있는 이미지 사이즈 조절하기
·
📱 iOS/UIKit
문제 상황버튼에 레이아웃을 아무리 건드려도 버튼 안에 들어있는 이미지는 늘어나지 않는다..!버튼 안에 있는 이미지 사이즈 조절하는 방법문제 해결개요현재 코드는 이렇게 버튼에만 레이아웃이 걸려있다.private let likeButton = UIButton(type: .custom)likeButton.setImage(.likeFill, for: .normal)likeButton.setAnchor( top: bookCoverView.bottomAnchor, trailing: dropDownButton.leadingAnchor, constantTrailing: 10, width: 40, height: 40)위 문제를 해결하기 위해 구글링 한 결과 4가지 정도 알아냈다.UIButton의 ContentEdg..
[UIKit] 런타임 시점에 Constraint를 조절하여 애니메이션 구현하기
·
📱 iOS/UIKit
문제 상황홈 화면에서 컬렉션 뷰를 통해 책들을 Flow하게 보여준다. 그리고 책을 생성하기 위해서는 우측 하단의 Floating 버튼이 있는데,이 버튼이 마지막 행의 오른쪽 책을 가리기 때문에 유저에서 ux적으로 불편함을 줄 수 있을 것이라 생각했다.이 문제를 해결해 나간 과정을 서술해보겠다.문제 해결아이디어플로팅 버튼은 우측 하단에 계속 띄워진 채 존재한다.마지막 행의 오른쪽 셀이 문제기 때문에 팀원과 논의한 끝에 ‘컬렉션뷰의 맨 아래에 도달하면 버튼을 숨기면 좋겠다’고 결론이 났다.그래서 버튼을 깜빡거리게 isHidden과 같은 요소를 사용할까? 했지만,유저에게 재미를 주기 위해 컬렉션 뷰 아래 바닥에 닿으면 아래로 슝 사라지고, 위로 스크롤하면 슝 올라오게 하려고 했다.(슝 이란 말로밖에 형용할 수..
[UIKit] Cell Identifier 지정할 때, 휴먼 에러를 방지하기
·
📱 iOS/UIKit
학습 목표TableView, CollectionView에서 Cell 등록할 때를 비롯하여Cell 이름을 알아야 할 때, identifier를 어떻게 작성해야 휴먼에러를 방지할 지 알아보기학습 내용첫 번째 방법: “Cell이름”으로 관리하기결론부터 말하면 제일 안 좋은 방법이다.final class IssueTableViewCell: UITableViewCell { }final class IssueListViewController: UIViewController { private let issueTableView = UITableView() override func viewDidLoad() { super.viewDidLoad() issueTableView.regi..
[UIKit] TableView에서 무한 스크롤 페이지네이션 처리
·
📱 iOS/UIKit
학습 목표무한 스크롤 페이지네이션 구현하기GitHub API에서 Issue와 Assignee 데이터를 받아오는 방법 이해하기TableView와 ViewModel을 활용한 무한 스크롤 구현학습 내용무한 스크롤 페이지네이션 구현본 프로젝트에서는 GitHub API로부터 Issue와 Assignee 데이터를 받아오고 있다. GitHub API는 기본적으로 한 페이지에 30개의 데이터를 제공하지만, 스크롤이 끝나갈 때 다음 페이지를 추가로 요청하는 무한 스크롤 방식으로 구현할 수 있다.1. 쿼리 파라미터 추가하기API 호출 시, URL에 페이지 번호를 쿼리로 추가해 페이지네이션을 처리한다. queryParameters에 페이지 정보를 넣어줘서 각 요청에 맞게 페이지가 포함된 URL을 생성할 수 있다.var qu..
[UIView] frame & bounds (3)
·
📱 iOS/UIKit
아래 좌표계가 나와서 본편의 사진은 소들님 걸로 사용하겠습니다사진 출처: 개발자 소들이학습 목표frame과 bounds를 언제 사용하는지 알아보자ScrollView를 곁들인,,학습 내용1. Frame은 언제 사용할까frame은 UIView의 위치, 크기를 나타낼 때 사용됨SuperView로부터 위치를 계산해서, size에 따라 그려주는 역할즉, UIView의 위치 및 크기 설정 때 사용함ley myView: UIView = .init(frame: frame)이처럼 UIView의 좌표 잡을 때 사용됨2. Bounds는 언제 사용할까UIView의 위치, 크기를 나타낼 때 사용함위치(origin): 자신의 좌표계크기(size): View 영역 자체의 크기a. View를 회전한 후, View의 실제 크기를 알고..