Titanium SDK UI expert
A practical guide to Titanium SDK UI. Covers layouts, event handling, animations, performance, and platform-specific components for iOS and Android.
Project detection
:::info auto-detects titanium projects This skill detects Titanium projects and provides UI guidance.
Detection happens automatically. You do not need to run a command.
Titanium project indicator:
tiapp.xml(required for all Titanium projects)
Applicable to both:
- Alloy projects (app/ folder structure)
- Classic projects (Resources/ folder)
Behavior based on detection:
- Titanium detected: Provide UI guidance for Alloy and Classic, ListView/TableView patterns, and platform differences
- Not detected: State this is for Titanium projects only and skip UI guidance :::
Quick reference
| Topic | Reference |
|---|---|
| App structures | application-structures.md |
| Layouts, positioning, units | layouts-and-positioning.md |
| Events, bubbling, lifecycle | event-handling.md |
| ScrollView vs ScrollableView | scrolling-views.md |
| TableView | tableviews.md |
| ListView templates, performance | listviews-and-performance.md |
| Touch, swipe, pinch, gestures | gestures.md |
| Orientation handling | orientation.md |
| Custom fonts, attributed strings | custom-fonts-styling.md |
| Animations, 2D/3D matrices | animation-and-matrices.md |
| Icons, splash screens, densities | icons-and-splash-screens.md |
| Android action bar, themes | platform-ui-android.md |
| iOS navigation, 3D Touch | platform-ui-ios.md |
| VoiceOver, TalkBack, a11y | accessibility-deep-dive.md |
Critical rules
Performance
- Do not use
Ti.UI.SIZEin ListViews. It causes jerky scrolling. Use fixed heights. - Prefer ListView over TableView for new apps with large datasets.
- Batch updates with
applyPropertiesto reduce bridge overhead. - Avoid WebView inside TableView. It kills scrolling performance.
iOS accessibility
- Do not set accessibility properties on container views. It blocks child interaction.
- Do not set
accessibilityLabelon text controls on Android. It overrides visible text.
Layout
- Use
dpunits for cross-platform consistency. - Android ScrollView is vertical or horizontal, not both. Set
scrollType.
Platform-specific properties
:::danger critical: platform-specific properties require modifiers
Using Ti.UI.iOS.* or Ti.UI.Android.* properties without platform modifiers will crash cross-platform compilation.
Example of the damage:
// Wrong: adds Ti.UI.iOS to an Android build
const win = Ti.UI.createWindow({
statusBarStyle: Ti.UI.iOS.StatusBar.LIGHT_CONTENT
})
Correct approaches:
Option 1: TSS modifier (Alloy projects):
"#mainWindow[platform=ios]": {
statusBarStyle: Ti.UI.iOS.StatusBar.LIGHT_CONTENT
}
Option 2: Conditional code:
if (OS_IOS) {
$.mainWindow.statusBarStyle = Ti.UI.iOS.StatusBar.LIGHT_CONTENT
}
Properties that always require platform modifiers:
- iOS:
statusBarStyle,modalStyle,modalTransitionStyle, anyTi.UI.iOS.* - Android:
actionBarconfig, anyTi.UI.Android.*constant
For platform-specific UI patterns, see platform-ui-ios.md and platform-ui-android.md. :::
Event management
- Remove global listeners (
Ti.App,Ti.Gesture,Ti.Accelerometer) on pause to save battery. - Input events bubble up. System events do not.
App architecture
- Limit tabs to 4 or fewer for better UX across platforms.
- Use NavigationWindow for iOS hierarchical navigation.
- Handle
androidbackto prevent unexpected exits.
Platform differences summary
| Feature | iOS | Android |
|---|---|---|
| 3D Matrix | Full support | No support |
| Pinch gesture | Full support | Limited |
| ScrollView | Bidirectional | Unidirectional |
| TableView | Full support | Full support |
| ListView | Full support | Full support |
| Default template image | Left side | Right side |
| ListView action items | Swipe actions | No |
| Modal windows | Fills screen, covers tab bar | No effect (always full) |
| Navigation pattern | NavigationWindow | Back button + Menu |
UI design workflow
- Choose app structure: tab-based or window-based
- Pick a layout mode: composite, vertical, or horizontal
- Decide sizing:
SIZEorFILLbased on component defaults - Plan events: bubbling, app-level events, lifecycle
- Optimize performance: templates, batch updates
- Apply accessibility per platform
- Add motion: animations, 2D/3D transforms, transitions
Searching references
When you need specific patterns, grep these terms in the reference files:
- App structure:
TabGroup,NavigationWindow,modal,execution context,androidback - Layouts:
dp,Ti.UI.SIZE,Ti.UI.FILL,composite,vertical,horizontal - Events:
addEventListener,cancelBubble,bubbling,Ti.App.fireEvent - TableView:
TableView,TableViewRow,setData,appendRow,className - ListView:
ItemTemplate,bindId,setItems,updateItemAt,marker - Gestures:
swipe,pinch,longpress,shake,accelerometer - Animation:
animate,create2DMatrix,create3DMatrix,autoreverse - Fonts:
fontFamily,PostScript,createAttributedString,ATTRIBUTE_ - Icons/splash:
DefaultIcon,appicon,nine-patch,drawable,splash,iTunesArtwork,adaptive - Android:
Action Bar,onCreateOptionsMenu,theme,Material3,talkback - iOS:
3D Touch,Popover,SplitWindow,badge,NavigationWindow - Accessibility:
accessibilityLabel,VoiceOver,TalkBack,accessibilityHidden
Related skills
For work beyond UI components, use these skills:
| Task | Use this skill |
|---|---|
| Project architecture, services, memory cleanup | ti-expert |
| Native features (camera, location, push, media) | ti-howtos |
| Alloy MVC, data binding, widgets | alloy-guides |