From d22877f79b3f6c97e094a7d4764ee872be26dcf1 Mon Sep 17 00:00:00 2001 From: louisehsu Date: Thu, 4 Dec 2025 01:01:31 -0800 Subject: [PATCH] works --- .../UserInterfaceState.xcuserstate | Bin 25473 -> 25482 bytes .../ios_content_resizing/ViewController.swift | 129 ++++++++++++------ 2 files changed, 84 insertions(+), 45 deletions(-) diff --git a/add_to_app/ios_content_resizing/ios_content_resizing/ios_content_resizing.xcworkspace/xcuserdata/louisehsu.xcuserdatad/UserInterfaceState.xcuserstate b/add_to_app/ios_content_resizing/ios_content_resizing/ios_content_resizing.xcworkspace/xcuserdata/louisehsu.xcuserdatad/UserInterfaceState.xcuserstate index 00060cb67b13e19db8e29ec7f3808905111b5c03..f241f8e3cefee7a65d46d3192eadb83a25092966 100644 GIT binary patch delta 6507 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 delta 6454 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 diff --git a/add_to_app/ios_content_resizing/ios_content_resizing/ios_content_resizing/ViewController.swift b/add_to_app/ios_content_resizing/ios_content_resizing/ios_content_resizing/ViewController.swift index 7dc8e4182..8a0e6d1cf 100644 --- a/add_to_app/ios_content_resizing/ios_content_resizing/ios_content_resizing/ViewController.swift +++ b/add_to_app/ios_content_resizing/ios_content_resizing/ios_content_resizing/ViewController.swift @@ -2,54 +2,93 @@ import Flutter import UIKit class ViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - - showScollView() - } - - func showScollView() { - let scrollView = UIScrollView() - scrollView.isUserInteractionEnabled = true + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemGroupedBackground + showStyledScrollView() + } - let stackView = UIStackView() - stackView.axis = .vertical - stackView.distribution = .fill - stackView.backgroundColor = .yellow - stackView.translatesAutoresizingMaskIntoConstraints = false + func showStyledScrollView() { + let scrollView = UIScrollView() + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 12 // Spacing between the "cards" - let engine1 = FlutterEngine(name: "one") - engine1.run() + let engine1 = FlutterEngine(name: "one") + engine1.run() - for index in 1...50 { - if (index == 10) { - let flutterViewController = FlutterViewController(engine: engine1, nibName: nil, bundle: nil) - flutterViewController.isAutoResizable = true - addChild(flutterViewController) - stackView.addArrangedSubview(flutterViewController.view) - flutterViewController.didMove(toParent: self) + for index in 1...50 { + if index == 10 { + // This is our Flutter view + let flutterViewController = FlutterViewController(engine: engine1, nibName: nil, bundle: nil) + flutterViewController.isAutoResizable = true + addChild(flutterViewController) + + // The Flutter view's background should be clear to see the card behind it + flutterViewController.view.backgroundColor = .clear + + // Wrap the Flutter view in a styled container "card" + let cardView = UIView() + cardView.backgroundColor = .systemBackground + cardView.layer.cornerRadius = 12 + cardView.layer.masksToBounds = true + + flutterViewController.view.translatesAutoresizingMaskIntoConstraints = false + cardView.addSubview(flutterViewController.view) + + NSLayoutConstraint.activate([ + flutterViewController.view.topAnchor.constraint(equalTo: cardView.topAnchor), + flutterViewController.view.leadingAnchor.constraint(equalTo: cardView.leadingAnchor), + flutterViewController.view.trailingAnchor.constraint(equalTo: cardView.trailingAnchor), + flutterViewController.view.bottomAnchor.constraint(equalTo: cardView.bottomAnchor) + ]) + + stackView.addArrangedSubview(cardView) + flutterViewController.didMove(toParent: self) - } else { - let label = UILabel() - label.text = "Hello from iOS \(index)" - stackView.addArrangedSubview(label) - } + } else { + let label = UILabel() + label.text = "It's me, iOS \(index)" + label.translatesAutoresizingMaskIntoConstraints = false + + let cardView = UIView() + cardView.backgroundColor = .systemBackground + cardView.layer.cornerRadius = 12 + cardView.addSubview(label) + + NSLayoutConstraint.activate([ + label.topAnchor.constraint(equalTo: cardView.topAnchor, constant: 16), + label.bottomAnchor.constraint(equalTo: cardView.bottomAnchor, constant: -16), + label.leadingAnchor.constraint(equalTo: cardView.leadingAnchor, constant: 16), + label.trailingAnchor.constraint(equalTo: cardView.trailingAnchor, constant: -16) + ]) + + stackView.addArrangedSubview(cardView) + } + } + + // --- Auto Layout Setup --- + scrollView.translatesAutoresizingMaskIntoConstraints = false + stackView.translatesAutoresizingMaskIntoConstraints = false + + view.addSubview(scrollView) + scrollView.addSubview(stackView) + + // Set constraints for the scroll view to fill the main view + NSLayoutConstraint.activate([ + scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), + scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) + ]) + + // Set constraints for the stack view within the scroll view + NSLayoutConstraint.activate([ + stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 20), + stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor, constant: -20), + // Inset the stack view horizontally for the grouped look + stackView.leadingAnchor.constraint(equalTo: scrollView.frameLayoutGuide.leadingAnchor, constant: 20), + stackView.trailingAnchor.constraint(equalTo: scrollView.frameLayoutGuide.trailingAnchor, constant: -20) + ]) } - scrollView.addSubview(stackView) - scrollView.layoutIfNeeded() - self.view.addSubview(scrollView) - - scrollView.translatesAutoresizingMaskIntoConstraints = false - scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true - scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true - scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true - scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true - - stackView.translatesAutoresizingMaskIntoConstraints = false - stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true - stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true - stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true - stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true - stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true - } }