Преглед на файлове

Refine paywall vertical spacing and footer placement.

Balance section gaps with equal flexible spacers and adjust top/bottom insets so the screen fills more professionally with cleaner footer alignment.

Made-with: Cursor
huzaifahayat12 преди 6 часа
родител
ревизия
24df0b12d6
променени са 1 файла, в които са добавени 30 реда и са изтрити 6 реда
  1. 30 6
      classroom_app/ViewController.swift

+ 30 - 6
classroom_app/ViewController.swift

@@ -2637,7 +2637,8 @@ private extension ViewController {
2637
         let contentStack = NSStackView()
2637
         let contentStack = NSStackView()
2638
         contentStack.translatesAutoresizingMaskIntoConstraints = false
2638
         contentStack.translatesAutoresizingMaskIntoConstraints = false
2639
         contentStack.orientation = .vertical
2639
         contentStack.orientation = .vertical
2640
-        contentStack.spacing = 14
2640
+        contentStack.spacing = 10
2641
+        contentStack.distribution = .fill
2641
         contentStack.alignment = .centerX
2642
         contentStack.alignment = .centerX
2642
         panel.addSubview(contentStack)
2643
         panel.addSubview(contentStack)
2643
         let paywallLayoutWidth: CGFloat = 980
2644
         let paywallLayoutWidth: CGFloat = 980
@@ -2717,6 +2718,13 @@ private extension ViewController {
2717
         contentStack.addArrangedSubview(benefitsRow)
2718
         contentStack.addArrangedSubview(benefitsRow)
2718
         benefitsRow.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2719
         benefitsRow.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2719
 
2720
 
2721
+        let midTopSpacer = NSView()
2722
+        midTopSpacer.translatesAutoresizingMaskIntoConstraints = false
2723
+        midTopSpacer.setContentHuggingPriority(.defaultLow, for: .vertical)
2724
+        midTopSpacer.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
2725
+        midTopSpacer.heightAnchor.constraint(greaterThanOrEqualToConstant: 8).isActive = true
2726
+        contentStack.addArrangedSubview(midTopSpacer)
2727
+
2720
         let plansRow = NSStackView()
2728
         let plansRow = NSStackView()
2721
         plansRow.translatesAutoresizingMaskIntoConstraints = false
2729
         plansRow.translatesAutoresizingMaskIntoConstraints = false
2722
         plansRow.orientation = .horizontal
2730
         plansRow.orientation = .horizontal
@@ -2768,6 +2776,13 @@ private extension ViewController {
2768
         plansRow.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2776
         plansRow.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2769
         updatePaywallPlanSelection()
2777
         updatePaywallPlanSelection()
2770
 
2778
 
2779
+        let midBottomSpacer = NSView()
2780
+        midBottomSpacer.translatesAutoresizingMaskIntoConstraints = false
2781
+        midBottomSpacer.setContentHuggingPriority(.defaultLow, for: .vertical)
2782
+        midBottomSpacer.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
2783
+        midBottomSpacer.heightAnchor.constraint(greaterThanOrEqualToConstant: 8).isActive = true
2784
+        contentStack.addArrangedSubview(midBottomSpacer)
2785
+
2771
         let offer = textLabel(paywallOfferText(for: selectedPremiumPlan), font: NSFont.systemFont(ofSize: 13, weight: .semibold), color: palette.textPrimary)
2786
         let offer = textLabel(paywallOfferText(for: selectedPremiumPlan), font: NSFont.systemFont(ofSize: 13, weight: .semibold), color: palette.textPrimary)
2772
         offer.alignment = .center
2787
         offer.alignment = .center
2773
         paywallOfferLabel = offer
2788
         paywallOfferLabel = offer
@@ -2822,6 +2837,15 @@ private extension ViewController {
2822
             secure.bottomAnchor.constraint(equalTo: secureWrap.bottomAnchor, constant: -4)
2837
             secure.bottomAnchor.constraint(equalTo: secureWrap.bottomAnchor, constant: -4)
2823
         ])
2838
         ])
2824
 
2839
 
2840
+        let footerTopSpacer = NSView()
2841
+        footerTopSpacer.translatesAutoresizingMaskIntoConstraints = false
2842
+        contentStack.addArrangedSubview(footerTopSpacer)
2843
+        footerTopSpacer.setContentHuggingPriority(.defaultLow, for: .vertical)
2844
+        footerTopSpacer.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
2845
+        footerTopSpacer.heightAnchor.constraint(greaterThanOrEqualToConstant: 8).isActive = true
2846
+        midTopSpacer.heightAnchor.constraint(equalTo: midBottomSpacer.heightAnchor).isActive = true
2847
+        midBottomSpacer.heightAnchor.constraint(equalTo: footerTopSpacer.heightAnchor).isActive = true
2848
+
2825
         let footer = paywallFooterLinks()
2849
         let footer = paywallFooterLinks()
2826
         contentStack.addArrangedSubview(footer)
2850
         contentStack.addArrangedSubview(footer)
2827
         footer.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2851
         footer.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
@@ -2829,8 +2853,8 @@ private extension ViewController {
2829
         NSLayoutConstraint.activate([
2853
         NSLayoutConstraint.activate([
2830
             contentStack.centerXAnchor.constraint(equalTo: panel.centerXAnchor),
2854
             contentStack.centerXAnchor.constraint(equalTo: panel.centerXAnchor),
2831
             contentStack.widthAnchor.constraint(equalToConstant: paywallLayoutWidth),
2855
             contentStack.widthAnchor.constraint(equalToConstant: paywallLayoutWidth),
2832
-            contentStack.topAnchor.constraint(equalTo: panel.topAnchor, constant: 20),
2833
-            contentStack.bottomAnchor.constraint(lessThanOrEqualTo: panel.bottomAnchor, constant: -16)
2856
+            contentStack.topAnchor.constraint(equalTo: panel.topAnchor, constant: 30),
2857
+            contentStack.bottomAnchor.constraint(equalTo: panel.bottomAnchor, constant: -20)
2834
         ])
2858
         ])
2835
 
2859
 
2836
         refreshPaywallStoreUI()
2860
         refreshPaywallStoreUI()
@@ -2942,7 +2966,7 @@ private extension ViewController {
2942
     func paywallFooterLinks() -> NSView {
2966
     func paywallFooterLinks() -> NSView {
2943
         let wrap = NSView()
2967
         let wrap = NSView()
2944
         wrap.translatesAutoresizingMaskIntoConstraints = false
2968
         wrap.translatesAutoresizingMaskIntoConstraints = false
2945
-        wrap.heightAnchor.constraint(equalToConstant: 34).isActive = true
2969
+        wrap.heightAnchor.constraint(equalToConstant: 56).isActive = true
2946
 
2970
 
2947
         let row = NSStackView()
2971
         let row = NSStackView()
2948
         row.translatesAutoresizingMaskIntoConstraints = false
2972
         row.translatesAutoresizingMaskIntoConstraints = false
@@ -2959,8 +2983,8 @@ private extension ViewController {
2959
         NSLayoutConstraint.activate([
2983
         NSLayoutConstraint.activate([
2960
             row.leadingAnchor.constraint(equalTo: wrap.leadingAnchor),
2984
             row.leadingAnchor.constraint(equalTo: wrap.leadingAnchor),
2961
             row.trailingAnchor.constraint(equalTo: wrap.trailingAnchor),
2985
             row.trailingAnchor.constraint(equalTo: wrap.trailingAnchor),
2962
-            row.topAnchor.constraint(equalTo: wrap.topAnchor),
2963
-            row.bottomAnchor.constraint(equalTo: wrap.bottomAnchor)
2986
+            row.topAnchor.constraint(greaterThanOrEqualTo: wrap.topAnchor),
2987
+            row.bottomAnchor.constraint(equalTo: wrap.bottomAnchor, constant: -4)
2964
         ])
2988
         ])
2965
 
2989
 
2966
         return wrap
2990
         return wrap