Panda
  • September 11, 2023

Create view hierarchies declaratively.

Quick Look


view.pd.add(
imageView.pd.image(logoImage),
label.pd.text(“Logo”).textColor(.red).font(size: 20),
button.pd.title(“Go”).action(buttonTapped)
)

It’s much shorter and concise than the imperative API, and easier to edit than storyboards.

Installation


Carthage

github “wordlessj/Panda” ~> 2.0

CocoaPods

pod ‘Panda’, ‘~> 2.0’

Usage


Basics

ALL settable properties and set methods in UIKit and Core Animation are available in pd extension, set prefixes are removed.

Views are configured and added to a superview as you see in Quick Look, you can also nest add() to create a more complex hierarchy, note that configuration by pd is optional.

view.pd.add(
containerView.pd.clipsToBounds(true).add(
view1.pd.backgroundColor(.red)
),
view2
)

Other types that can be added by add*() methods are also supported, like UIGestureRecognizer and UILayoutGuide. Don’t put them all in one add() method, grouping is recommended.

view.pd.add(
// view hierarchy
).add(
layoutGuide.pd.identifier(“center guide”)
).add(
tapGestureRecognizer.pd.numberOfTapsRequired(2).action(doubleTapped)
)

Objects can be configured inline and passed to a method, if the method accepts a *Convertible.

// mask() accepts a UIViewConvertible.
// You can pass a plain or configured UIView.
view.pd.mask(
maskView.pd.backgroundColor(.white)
)

Custom Properties

With smart key paths, you can use set() to set custom properties not found in Panda.

customView.pd.set(\.flashes, true)

Action

Target-actions are replaced with action() taking a closure. They’re available on following types.

  • CADisplayLink, an initializer instead of action().
  • UIAccessibilityCustomAction
  • UIBarButtonItem
  • UIControl
  • UIGestureRecognizer

Font

UIFont factory methods are available directly as following methods.

  • font(style:)
  • font(style:compatibleWith:)
  • font(size:)
  • font(size:weight:)
  • font(boldSize:)
  • font(italicSize:)
  • font(monospacedDigitSize:weight:)

They’re available on following types.

  • UIButton, set font of titleLabel.
  • UILabel
  • UISimpleTextPrintFormatter
  • UITextField
  • UITextView

Transform

There’re several convenient methods to set transform on UICollectionViewLayoutAttributes and UIView. Each of them has a corresponding concat*() method to concatenate a transform to existing transform.

  • rotation(radian:)
  • rotation(degree:)
  • scale(x:y:)
  • scale(_:)
  • translation(x:y:)

Control States and Bar Metrics

For set methods taking a UIControlState or UIBarMetrics like title(_:for:), there’re convenience methods to set for all states or metrics like title(_:highlighted:selected:disabled:), the first parameter is for normal state, and the other parameters are optional.

Set-Like Methods

Some methods don’t begin with set but are usually called while configuring, they are available as well.

  • UIAlertController.pd.addTextField(configure:)
  • UIGestureRecognizer.pd.require(toFail:)

Register and Dequeue

For UICollectionView and UITableView, an identifier is required when registering and dequeuing cells and views, and force casting to a specific type is usually needed. In practice, one identifier is associated with one specific type, so you can use the type itself instead of an identifier.

collectionView.pd.register(CustomCell.self)

let cell: CustomCell = collectionView.pd.dequeue(CustomCell.self, for: indexPath)

Reuse

If more than one object share similar configurations, or you want to create something like CSS, you can extract configurations into a method, then apply the method using do().

view.pd.add(
firstLabel.pd.do(configLabel),
secondLabel.pd.do(configLabel)
)

func configLabel(_ label: UILabel) {
label.pd.textColor(.red).font(size: 20).numberOfLines(0)
}

GitHub


View Github

#ios #swift #view
YOU MIGHT ALSO LIKE...
Popup View

Floaters Toasts Popups Sheets

Drops 💧

A µFramework for showing alerts like the one used when copying from pasteboard or connecting Apple pencil.

MarqueeText

A SwiftUI Marquee or "scrolling text" effect found in Apple native apps. For when one line isn't enough, but two ...

TextBuilder

Introduction Text composition in SwiftUI can often be cumbersome, especially when there's logic affecting its format and content. TextBuilder leverages the ...

TextView

Download File -> Swift Packages -> Add Package Dependency... Select your project Enter https://github.com/kenmueller/TextView for the package repository URL Select Branch: master Click Finish ...