iyeaaa의 등록된 링크

 iyeaaa로 등록된 티스토리 포스트 수는 10건입니다.

withAnimation 버그 해결 [내부링크]

https://stackoverflow.com/questions/77022165/why-occur-animation-effect-in-swiftui Why occur animation effect in SwiftUI struct ContentView: View { var randColor: Color { Color(red: randomNumber/255, green: randomNumber/255, blue: randomNumber/255) } @State var isAnimation = false var stackoverflow.com stackoverflow에 질문을 올렸었는데, 분명히 아래의 Rectangle은 색이 변하는 애니메이션이 작동할 이유가 없다. 하지만 지속적으로 색이 변하는 애니메이션이..

ForEach의 ID [SwiftUI] [내부링크]

ForEach View를 사용할 때 ID로 \.self를 넣어주고는 한다. struct ContentView: View { let colors: [Color] = [.red, .green, .blue] var body: some View { VStack { ForEach(colors, id: \.self) { color in Text(color.description.capitalized) .padding() .background(color) } } } } ForEach로 생성되는 각 뷰들이 생성되거나 삭제될 때 그 부분만 업데이트하기위해 ID값을 통해서 뷰를 구별한다. 이를 위해서 id인자를 넣어주게 된다. public init(_ data: Data, id: KeyPath, @ViewBuilder co..

keyPath의 함수기능 [내부링크]

User 구조체를 정의하고 그 배열을 만들자 struct User { let email: String let isAdmin: Bool } let users = [User(email: "A", isAdmin: true), User(email: "B", isAdmin: false), User(email: "C", isAdmin: true), User(email: "D", isAdmin: false)] 그리고 map을 이용해서 email이나 isAdmin값을 가져오거나 filter를 사용하려면 클로저를 전달해야한다. users.map{$0.email} users.map{$0.isAdmin} users.filter{$0.isAdmin} 하지만 keyPath를 함수처럼 사용해서 더 예쁘게 작성할 수 있다. use..

UIImageView를 Image 크기에 맞추기 [Swift] [내부링크]

문제점: UIImageView에서 scaleToFit 설정을 준 후, constraint를 통해 width가 화면 뷰에 맞도록 고정시켰다. 하지만 UIImagView의 크기가 줄어들지 않아 남는 여백이 생겨 UIImageView를 Image 크기에 맞게 AutoLayout을 설정하려 한다. 해결법: 1. Image의 비율을 저장한다. 2. AutoLayout의 height 설정에서 저장한 비율을 이용해 UIImageView의 width값으로 height값을 구해 AutoLayout을 설정한다. private let postImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFit iv.layer.borderWidth..

비동기 함수 여러개 호출 후 completionHandler 호출 [내부링크]

비동기 함수를 하나만 사용할 때에는 그냥 completionHandler를 사용하면 되지만, 비동기 함수를 여러개 호출 후 가장 마지막에 끝나는 함수가 종료된 후에 completionHandler를 호출시킬 수 있다. 어떤 상황이냐면, 비동기 함수를 하나만 호출할 때는 completionHandler에 함수가 종료된 후 호출될 함수를 넣어주면 정상적으로 동작하지만, 여러개의 비동기 함수를 호출했을 때(for문을 써서 호출하는 등)의 상황을 보면 저런식일거다. 비동기함수는 먼저 호출한 함수가 먼저 종료된다는 보장도 되어있지 않고, for문을 이용해서 같은 함수를 보낸다면 어떤 한 함수에만 completionHandler를 넣어주는것도 이상하고 원하는 대로 작동한다는 보장도 되어있지 않을것이다. 그렇다고 모..

cell의 이벤트 에러 [Swift] [내부링크]

이 글은 뇌피셜을 기반으로 합니다. cell에게 이벤트 주는 요소를 두 가지정도로 나누면 UIControl의 서브클래스, UIControl을 상속하지 않는 UIView 로 나눌 수 있을 것 같습니다. 나누는 기준에 대해 말씀드리면 UIControl의 서브클래스들은 cell에 넣었을 때 클릭이 잘 되는 설정이 따로 되어있는건지는 모르겠지만, cell 자체에 넣어도 지금 말하려는 문제가 생기지 않습니다. 문제는 후자인데, cell에 contentView 라는 서브뷰가 있습니다. 그리고 이 서브뷰는 isUserInteractionEnabled가 true로 설정되어있어요. 또한 후자의 뷰에게 이벤트를 주려면 let iv = UIView() let tap = UITapGestureRecognizer(target:..

addGestureRecognizer와 addTarget 차이 [Swift] [내부링크]

버튼이나, view에게 클릭했을 때 이벤트를 발생하도록 하는 방법이 두 가지정도 되는것같다. UIView를 생성해서 UITapGestureRecognizer를 이용하거나, let iv = UIView() let tap = UITapGestureRecognizer(target: self, action: #selector(handleProfileImageView)) iv.isUserInteractionEnabled = true iv.addGestureRecognizer(tap) addTarget 함수를 이용하는 방법이다. let button = UIButton() button.addTarget(self, action: #selector(tapFollowButton), for: .touchUpInside) 첫..

UITextView의 intrinsicContentSize [내부링크]

UITextView의 isScrollEnabled 가 false일 때 intrinsicContentSize가 활성화 됩니다. 자세히 봅시다. - textView를 생성해서 isScrollEnabled를 true 로 주면 (-1.0, -1.0) 이 출력됩니다. swift에서는 intrinsicContentSize 가 없을 때 (-1, -1)의 값을 가집니다. (항상 -1, -1을 가지는지는 모르겠으나 UIView에서도 값이 없을 때도 -1, -1을 가집니다.) - 이번엔 isScrollEnabled 가 false 로 주고 출력해보면 (10.0, 52.0) 이 출력됩니다. intrinsicContentSize 가 생겼습니다. 다시 정리를 하면, isScrollEnabled를 false로 설정하면 UIText..

Firebase currentUser 에러 해결방법 in iOS Swift [내부링크]

https://firebase.google.com/docs/auth/ios/manage-users?hl=ko#swift_1 Firebase에서 사용자 관리하기 | Firebase Authentication Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 Firebase에서 사용자 관리하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요 firebase.google.com 공식문서에 따르면 사용자의 정보를 불러오는 방식에는 2가지가 있다. if Auth.auth().currentUser != nil { // User is signed in. // ... } else { // No user is signed in. // ....

프로퍼티 감시자가 호출되는 경우 [Swift] [내부링크]

struct Notification { let postImageURL: String? let postID: String? var userIsFollowed = false } Notification 구조체가 있다고 합시다. var notifications = [Notification]() { didSet { tableView.reloadData() } } 이 구조체를 이용해서 프로퍼티 감시자를 가진 배열을 하나 만들었습니다. 프로퍼티 감시자는 다음 세가지 모든 상황에서 호출됩니다. self.notifications = notifications notifications[index] = Notification() notifications[index].userIsFollowd = isFollowed 1. 프로..