nathantannar4 / Transmission

Bridges UIKit presentation APIs to a SwiftUI API so you can use presentation controllers, interactive transitions and more.
BSD 2-Clause "Simplified" License
378 stars 13 forks source link

Wrong sheet height when ideal presentation is used with constrainted UIViewRepresentable #6

Closed PhilipDukhov closed 1 year ago

PhilipDukhov commented 1 year ago

Somehow height of the sheet is not calculated correctly when some NSLayoutConstraints with Text are involved.


Expected behavior - happens if in the example below you remove child subview from TestView, or remove TestView completely.

p.s. actually even in this case there's an other bug, when you have content size bigger than container, as you can see at the end of the video. if you use static height, both bugs are "fixed"

https://github.com/nathantannar4/Transmission/assets/6103621/2a092b92-d588-4fcd-95aa-2078681a3b81


Actual behavior:

https://github.com/nathantannar4/Transmission/assets/6103621/7d3bc777-06b4-4ae1-9db7-0c5e852cf2a9

import SwiftUI
import Transmission

struct TestView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let container = UIView()
        container.backgroundColor = .gray
        let child = UIView()
        container.addSubview(child)

        child.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            child.topAnchor.constraint(equalTo: container.topAnchor),
            child.bottomAnchor.constraint(equalTo: container.bottomAnchor),
            child.leftAnchor.constraint(equalTo: container.leftAnchor),
            child.rightAnchor.constraint(equalTo: container.rightAnchor)
        ])

        return container
    }

    func updateUIView(_ uiView: UIView, context: Context) {

    }
}

struct ContentView: View {
    @State var sliderValue: CGFloat = CGFloat(loremIpsum.count) / 2

    var body: some View {
        VStack {
            Text("Hello, world!")
                .presentation(
                    transition: .sheet(
                        options: .init(
                            detents: [.ideal]
                        )
                    ),
                    isPresented: .constant(true)
                ) {
                    VStack {
                        TestView()
                            .frame(width: 40, height: 40)
                        HStack(alignment: .top) {
                            VStack {
                                Slider(value: $sliderValue, in: 1...CGFloat(loremIpsum.count - 1))
                                Text(loremIpsum.dropLast(loremIpsum.count - Int(sliderValue.rounded()) - 1))
                            }
                        }
                    }
                }
        }
        .padding()
    }
}

let loremIpsum = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec enim mi, auctor vitae varius a, vulputate malesuada urna. Cras id ornare magna. Praesent turpis libero, pellentesque et interdum ut, ultricies a nibh. Curabitur nisl erat, iaculis nec varius non, pellentesque elementum dolor. Sed aliquam felis non nulla gravida, a tempor massa sagittis. Nunc egestas, nisi non sollicitudin mattis, tortor libero sodales lacus, luctus luctus diam tortor in ipsum. Cras ut lectus consequat, volutpat lectus et, blandit dolor. In accumsan justo eget metus pellentesque, et tristique dui pharetra. Nunc aliquam mauris nisl, quis congue tortor tincidunt in.

Donec tristique blandit ligula, ac volutpat nulla lacinia non. Curabitur ut nulla suscipit, ornare risus ac, auctor dui. Donec erat enim, dictum in efficitur eget, hendrerit ut velit. Quisque tincidunt nibh nisl, vitae viverra orci auctor id. Vestibulum eu sodales justo, at laoreet justo. Curabitur ullamcorper felis ligula, in placerat libero cursus at. Nullam nec cursus metus. Mauris sit amet felis sit amet nisi viverra luctus. Nullam bibendum in mauris in iaculis. Phasellus fermentum sem lorem, eu pretium urna ultrices non. Pellentesque scelerisque ligula turpis.

Vestibulum interdum cursus dui, at placerat nunc venenatis interdum. Nullam consequat, libero eget sagittis faucibus, dui tortor lobortis magna, vel hendrerit nunc ligula sit amet sapien. Aliquam faucibus id est at euismod. Integer gravida vitae arcu vel aliquet. In hac habitasse platea dictumst. Duis sodales vehicula mauris et molestie. Nunc vulputate sem ut molestie dapibus. Nulla blandit dui ut ipsum vulputate, quis lobortis lacus porttitor.
"""
nathantannar4 commented 1 year ago

Weird, UIKit's systemLayoutSizeFitting was giving .infinity for the height.

Fixed in 0.1.24