Panel Views

Panels

The full panel family beyond the base shadow variant. These views provide ready-made card containers with stacks, titles, scroll areas, and button integrations. All combine TTBaseUIStackView and TTBaseScrollPanelView to create common layout patterns.

ClassDescription
TTBaseStackPanelViewView + embedded vertical stack (add content to stack)
TTBaseStackShadowPanelViewShadow card + embedded vertical stack
TTBaseTitlePanelViewCard with title label at the top
TTBaseScrollPanelViewScrollable vertical panel with keyboard dismiss
TTBasePanelButtonViewView + action button combined
TTBasePanelViewUIStackViewPanel backed by UIStackView layout

🚀 Usage

// Stack panel — add arranged subviews to panelStackView
let panel = TTBaseStackPanelView()
panel.panelStackView.addArrangedSubview(nameLabel)
panel.panelStackView.addArrangedSubview(emailLabel)
panel.panelStackView.addArrangedSubview(submitButton)

// Shadow stack panel (card style)
let card = TTBaseStackShadowPanelView()
card.panelStackView.addArrangedSubview(iconView)
card.panelStackView.addArrangedSubview(titleLabel)

// Title panel
let titled = TTBaseTitlePanelView(titleText: "Personal Info")
titled.contentView.addSubview(nameTextField)

// Scroll panel (for long forms)
let scrollPanel = TTBaseScrollPanelView()
scrollPanel.stackView.addArrangedSubview(field1)
scrollPanel.stackView.addArrangedSubview(field2)
scrollPanel.stackView.addArrangedSubview(field3)
// ... keyboard auto-dismisses on drag

// Panel with button
let panelWithButton = TTBasePanelButtonView(buttonTitle: "Continue")
panelWithButton.onButtonTouchHandler = { [weak self] in
    self?.navigateToNext()
}

📜 TTBaseScrollPanelView in Detail

// Use as form container
class MyFormViewController: TTBaseScrollViewController {
    // Override paddingScroll for form padding:
    override var paddingScroll: (CGFloat, CGFloat, CGFloat, CGFloat) {
        return (0, TTSize.H_NAV, 0, TTSize.H_TABBAR)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Add form views to baseScrollView.stackView
        baseScrollView.stackView?.addArrangedSubview(nameFieldView)
        baseScrollView.stackView?.addArrangedSubview(emailFieldView)
    }
}
Pro Tip: For forms, always use TTBaseScrollViewController (wraps TTBaseScrollPanelView) instead of manually embedded scroll views. It handles keyboard dismiss mode, safe area insets, and width constraints automatically.