Hey Brian, superb content as always. You always add so much value to existing lessons!!
I came from episode 7 and 16, I incorporated your code in Swift, not SwiftUI. Same behaviour.
Replace for Swift projects in the observers
UIView.animate(withDuration: 0.3, animations: {
self?.locationsController.view!.frame.origin.y -= (self!.keyboardHeight - self!.view.safeAreaInsets.bottom + 5) //+5 is so the carousel doesn't stick exactly to keyboard's top
}, completion: nil)
UIView.animate(withDuration: 0.3) {
self?.locationsController.view!.frame.origin.y += self!.keyboardHeight
}
Question1:
Is there a way to dynamically set the carousel constraint like the custom image callout in episode 21 instead of using "locationsController.view!.frame.origin.y"?
Episode 21 Code
if image.size.width > image.size.height {
// w1/h1 = w2/h2; h1 = w1/w2*h2
let newWidth : CGFloat = 180
let newHeight = newWidth / image.size.width * image.size.height
widthAnchor.constant = newWidth
heightAnchor.constant = newHeight
Question2:
This is probably a tricky question. When I first search with no carousel, I get the following warning. How do I make it so the first search has the carousel on top of the keyboard?
[UICollectionView] Warning: Invalid IndexPath <NSIndexPath: 0xdee85593a171916d> {length = 2, path = 0 - 0} specified - will use a contentOffset of {0,0} as a fallback value. <UICollectionView: 0x103832c00; frame = (0 0; 375 100); autoresize = W+H; gestureRecognizers = <NSArray: 0x28376a4c0>; layer = <CALayer: 0x2839c3da0>; contentOffset: {0, 0}; contentSize: {32, 100}; adjustedContentInset: {0, 0, 0, 0}; layout: <UICollectionViewFlowLayout: 0x10b74d800>; dataSource: <MapKitTeachMe.LocationsCarouselController: 0x10b74da20>>
Question3:
for "self?.locationsController.view!.frame.origin.y += self!.keyboardHeight"
is "self!" safe? and what does "self!" really mean?
Thank you so much Brian!!