diff --git a/apps/toolbox/src/pages/glass-effects.ts b/apps/toolbox/src/pages/glass-effects.ts
index 991a73fa2..a53d3668d 100644
--- a/apps/toolbox/src/pages/glass-effects.ts
+++ b/apps/toolbox/src/pages/glass-effects.ts
@@ -1,4 +1,4 @@
-import { Observable, EventData, Page, CoreTypes, GlassEffectConfig } from '@nativescript/core';
+import { Observable, EventData, Page, CoreTypes, GlassEffectConfig, View, GlassEffectType, TouchAnimationOptions, Label, Image } from '@nativescript/core';
let page: Page;
@@ -7,10 +7,154 @@ export function navigatingTo(args: EventData) {
page.bindingContext = new GlassEffectModel();
}
+const originalTransform = Symbol('originalTransform');
+
export class GlassEffectModel extends Observable {
iosGlassEffectInteractive: GlassEffectConfig = {
interactive: true,
tint: '#faabab',
variant: 'clear',
};
+ currentEffect: GlassEffectConfig = {
+ variant: 'none',
+ interactive: false,
+ // tint: '#ccc',
+ };
+
+ toggleGlassEffect(args) {
+ const btn = args.object as View;
+ this.currentEffect =
+ this.currentEffect.variant === 'none'
+ ? {
+ variant: 'clear',
+ interactive: true,
+ // tint: '#faabab',
+ }
+ : {
+ variant: 'none',
+ interactive: false,
+ // tint: '#ccc',
+ };
+ btn.iosGlassEffect = this.currentEffect;
+ }
+
+ images = ['res://bg1.jpg', 'res://bg2.jpg', 'res://bg3.jpg'];
+ currentImage = this.images[0];
+ cycleImage() {
+ if (!this.image) {
+ return;
+ }
+ let currentIndex = this.images.indexOf(this.currentImage);
+ currentIndex++;
+ if (currentIndex === this.images.length) {
+ currentIndex = 0;
+ }
+ this.currentImage = this.images[currentIndex];
+ // this.notifyPropertyChange('currentImage', this.currentImage);
+ this.image.animate({ opacity: 0, duration: 300, curve: CoreTypes.AnimationCurve.easeInOut }).then(() => {
+ this.image.src = this.currentImage;
+ setTimeout(() => {
+ this.image.animate({ opacity: 1, duration: 800, curve: CoreTypes.AnimationCurve.easeInOut });
+ });
+ });
+ }
+
+ image: Image;
+ loadedImage(args) {
+ this.image = args.object as Image;
+ }
+
+ glassMerged = false;
+ glassTargets = {};
+ loadedGlass(args) {
+ const glass = args.object as View;
+ switch (glass.id) {
+ case 'glass1':
+ glass.translateX = -40;
+ break;
+ case 'glass2':
+ glass.translateX = 40;
+
+ break;
+ }
+ this.glassTargets[glass.id] = glass;
+ }
+
+ glassTargetLabels: { [key: string]: Label } = {};
+ loadedGlassLabels(args) {
+ const label = args.object as Label;
+ this.glassTargetLabels[label.id] = label;
+ }
+
+ toggleMergeGlass() {
+ if (!this.glassTargets['glass1'] || !this.glassTargets['glass2']) {
+ return;
+ }
+ this.glassMerged = !this.glassMerged;
+ const glass1 = this.glassTargets['glass1'];
+ const glass2 = this.glassTargets['glass2'];
+ glass1.animate({ translate: { x: this.glassMerged ? -40 : 0, y: 0 }, duration: 300, curve: CoreTypes.AnimationCurve.easeInOut }).catch(() => {});
+ glass2.animate({ translate: { x: this.glassMerged ? 40 : 0, y: 0 }, duration: 300, curve: CoreTypes.AnimationCurve.easeInOut }).catch(() => {});
+
+ this.glassTargetLabels['share'].animate({ opacity: this.glassMerged ? 1 : 0, duration: 300, curve: CoreTypes.AnimationCurve.easeInOut }).catch(() => {});
+
+ this.glassTargetLabels['like'].text = this.glassMerged ? 'Done' : 'Like';
+ }
+
+ touchAnimation: TouchAnimationOptions = {
+ down: (view: View) => {
+ if (__APPLE__) {
+ UIView.animateWithDurationDelayUsingSpringWithDampingInitialSpringVelocityOptionsAnimationsCompletion(
+ 0.3,
+ 0,
+ 0.5,
+ 3,
+ UIViewAnimationOptions.CurveEaseInOut | UIViewAnimationOptions.AllowUserInteraction,
+ () => {
+ if (view?.ios) {
+ view[originalTransform] = view[originalTransform] ?? view.ios.transform;
+
+ view.ios.transform = CGAffineTransformConcat(view[originalTransform], CGAffineTransformMakeScale(0.97, 0.97));
+ }
+ },
+ null,
+ );
+ } else {
+ view
+ ?.animate({
+ scale: { x: 0.97, y: 0.97 },
+ duration: 120,
+ curve: CoreTypes.AnimationCurve.easeInOut,
+ })
+ .then(() => {})
+ .catch(() => {});
+ }
+ },
+ up: (view: View) => {
+ if (__APPLE__) {
+ UIView.animateWithDurationDelayUsingSpringWithDampingInitialSpringVelocityOptionsAnimationsCompletion(
+ 0.3,
+ 0,
+ 0.5,
+ 3,
+ UIViewAnimationOptions.CurveEaseInOut | UIViewAnimationOptions.AllowUserInteraction,
+ () => {
+ if (view?.ios) {
+ view.ios.transform = view[originalTransform] ?? CGAffineTransformMakeScale(1, 1);
+ }
+ },
+ null,
+ );
+ } else {
+ view
+ ?.animate({
+ scale: { x: 1, y: 1 },
+ duration: 120,
+ curve: CoreTypes.AnimationCurve.easeInOut,
+ })
+ .then(() => {})
+ .catch(() => {});
+ }
+ },
+ };
}
diff --git a/apps/toolbox/src/pages/glass-effects.xml b/apps/toolbox/src/pages/glass-effects.xml
index 817ad6616..be7848ed2 100644
--- a/apps/toolbox/src/pages/glass-effects.xml
+++ b/apps/toolbox/src/pages/glass-effects.xml
@@ -1,27 +1,55 @@
-
+
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
diff --git a/packages/core/ui/button/index.ios.ts b/packages/core/ui/button/index.ios.ts
index 753b1e136..ab2379e23 100644
--- a/packages/core/ui/button/index.ios.ts
+++ b/packages/core/ui/button/index.ios.ts
@@ -2,10 +2,11 @@ import { ControlStateChangeListener } from '../core/control-state-change';
import { ButtonBase } from './button-common';
import { View, PseudoClassHandler } from '../core/view';
import { borderTopWidthProperty, borderRightWidthProperty, borderBottomWidthProperty, borderLeftWidthProperty, paddingLeftProperty, paddingTopProperty, paddingRightProperty, paddingBottomProperty } from '../styling/style-properties';
-import { textAlignmentProperty, whiteSpaceProperty, textOverflowProperty } from '../text-base';
+import { textAlignmentProperty, whiteSpaceProperty, textOverflowProperty, textProperty } from '../text-base';
+import { resetSymbol } from '../text-base/text-base-common';
import { layout } from '../../utils';
+import { SDK_VERSION } from '../../utils/constants';
import { CoreTypes } from '../../core-types';
-import { Color } from '../../color';
export * from './button-common';
@@ -208,6 +209,34 @@ export class Button extends ButtonBase {
};
}
+ // [textProperty.setNative](value: string | number | symbol) {
+ // if (SDK_VERSION >= 26) {
+ // const config = UIButtonConfiguration.plainButtonConfiguration();
+ // // const attrs = {};
+ // // attrs[NSFontAttributeName] = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline);
+ // // config.attributedTitle = NSAttributedString.alloc().initWithStringAttributes(this.text, {
+ // // [NSFontAttributeName]: UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline),
+ // // } as any);
+ // //attributes: AttributeContainer([
+ // // .font : UIFont.preferredFont(forTextStyle: .headline)
+ // // ])
+ // this.nativeViewProtected.tintColor = UIColor.labelColor;
+ // config.contentInsets = NSDirectionalEdgeInsetsFromString('8,12,8,12');
+ // // semantic; flips as needed over glass
+ // config.baseForegroundColor = UIColor.labelColor;
+ // this.nativeViewProtected.configuration = config;
+ // this._requestLayoutOnTextChanged();
+ // } else {
+ // const reset = value === resetSymbol;
+ // if (!reset && this.formattedText) {
+ // return;
+ // }
+
+ // this._setNativeText(reset);
+ // this._requestLayoutOnTextChanged();
+ // }
+ // }
+
[textAlignmentProperty.setNative](value: CoreTypes.TextAlignmentType) {
switch (value) {
case 'left':
diff --git a/packages/core/ui/core/view/index.ios.ts b/packages/core/ui/core/view/index.ios.ts
index 9861514b1..b70c718c4 100644
--- a/packages/core/ui/core/view/index.ios.ts
+++ b/packages/core/ui/core/view/index.ios.ts
@@ -2,7 +2,7 @@
import { Point, Position, View as ViewDefinition } from '.';
// Requires
-import { ViewCommon, isEnabledProperty, originXProperty, originYProperty, isUserInteractionEnabledProperty, testIDProperty, iosGlassEffectProperty, GlassEffectType, GlassEffectVariant } from './view-common';
+import { ViewCommon, isEnabledProperty, originXProperty, originYProperty, isUserInteractionEnabledProperty, testIDProperty, iosGlassEffectProperty, GlassEffectType, GlassEffectVariant, GlassEffectConfig } from './view-common';
import { ShowModalOptions, hiddenProperty } from '../view-base';
import { Trace } from '../../../trace';
import { layout, ios as iosUtils } from '../../../utils';
@@ -901,42 +901,47 @@ export class View extends ViewCommon implements ViewDefinition {
if (!this.nativeViewProtected || !supportsGlass()) {
return;
}
- if (this._glassEffectView) {
- this._glassEffectView.removeFromSuperview();
- this._glassEffectView = null;
- }
- if (!value) {
- return;
- }
- let effect: UIGlassEffect;
- if (typeof value === 'string') {
- effect = UIGlassEffect.effectWithStyle(this.toUIGlassStyle(value));
+ let effect: UIGlassEffect | UIVisualEffect;
+ const config: GlassEffectConfig | null = typeof value !== 'string' ? value : null;
+ const variant = config ? config.variant : (value as GlassEffectVariant);
+ const defaultDuration = 0.3;
+ const duration = config ? (config.animateChangeDuration ?? defaultDuration) : defaultDuration;
+
+ if (!value || ['identity', 'none'].includes(variant)) {
+ // empty effect
+ effect = UIVisualEffect.new();
} else {
- if (value.variant === 'identity') {
- return;
- }
- effect = UIGlassEffect.effectWithStyle(this.toUIGlassStyle(value.variant));
- if (value.interactive) {
- effect.interactive = true;
- }
- if (value.tint) {
- effect.tintColor = typeof value.tint === 'string' ? new Color(value.tint).ios : value.tint;
+ effect = UIGlassEffect.effectWithStyle(this.toUIGlassStyle(variant));
+ if (config) {
+ (effect as UIGlassEffect).interactive = !!config.interactive;
+ if (config.tint) {
+ (effect as UIGlassEffect).tintColor = typeof config.tint === 'string' ? new Color(config.tint).ios : config.tint;
+ }
}
}
- this._glassEffectView = UIVisualEffectView.alloc().initWithEffect(effect);
- // let touches pass to content
- this._glassEffectView.userInteractionEnabled = false;
- this._glassEffectView.clipsToBounds = true;
- // size & autoresize
- if (this._glassEffectMeasure) {
- clearTimeout(this._glassEffectMeasure);
+
+ if (!this._glassEffectView) {
+ this._glassEffectView = UIVisualEffectView.alloc().initWithEffect(effect);
+ // this._glassEffectView.overrideUserInterfaceStyle = UIUserInterfaceStyle.Light;
+ // let touches pass to content
+ this._glassEffectView.userInteractionEnabled = false;
+ this._glassEffectView.clipsToBounds = true;
+ // size & autoresize
+ if (this._glassEffectMeasure) {
+ clearTimeout(this._glassEffectMeasure);
+ }
+ this._glassEffectMeasure = setTimeout(() => {
+ const size = this.nativeViewProtected.bounds.size;
+ this._glassEffectView.frame = CGRectMake(0, 0, size.width, size.height);
+ this._glassEffectView.autoresizingMask = 2;
+ this.nativeViewProtected.insertSubviewAtIndex(this._glassEffectView, 0);
+ });
+ } else {
+ // animate effect changes
+ UIView.animateWithDurationAnimations(duration, () => {
+ this._glassEffectView.effect = effect;
+ });
}
- this._glassEffectMeasure = setTimeout(() => {
- const size = this.nativeViewProtected.bounds.size;
- this._glassEffectView.frame = CGRectMake(0, 0, size.width, size.height);
- this._glassEffectView.autoresizingMask = 2;
- this.nativeViewProtected.insertSubviewAtIndex(this._glassEffectView, 0);
- });
}
public toUIGlassStyle(value?: GlassEffectVariant) {
diff --git a/packages/core/ui/core/view/view-common.ts b/packages/core/ui/core/view/view-common.ts
index 3e592c497..bde19bf22 100644
--- a/packages/core/ui/core/view/view-common.ts
+++ b/packages/core/ui/core/view/view-common.ts
@@ -105,6 +105,11 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
public visionHoverStyle: string | VisionHoverOptions;
public visionIgnoreHoverStyle: boolean;
+ /**
+ * iOS 26+ Glass
+ */
+ iosGlassEffect: GlassEffectType;
+
protected _closeModalCallback: Function;
public _manager: any;
public _modalParent: ViewCommon;
@@ -1317,8 +1322,16 @@ iosIgnoreSafeAreaProperty.register(ViewCommon);
/**
* Glass effects
*/
-export type GlassEffectVariant = 'regular' | 'clear' | 'identity';
-export type GlassEffectConfig = { variant?: GlassEffectVariant; interactive?: boolean; tint: string | Color };
+export type GlassEffectVariant = 'regular' | 'clear' | 'identity' | 'none';
+export type GlassEffectConfig = {
+ variant?: GlassEffectVariant;
+ interactive?: boolean;
+ tint?: string | Color;
+ /**
+ * Duration in milliseconds to animate effect changes (default is 300ms)
+ */
+ animateChangeDuration?: number;
+};
export type GlassEffectType = GlassEffectVariant | GlassEffectConfig;
export const iosGlassEffectProperty = new Property({
name: 'iosGlassEffect',
diff --git a/packages/core/ui/layouts/index.d.ts b/packages/core/ui/layouts/index.d.ts
index e6969f47b..e98adb302 100644
--- a/packages/core/ui/layouts/index.d.ts
+++ b/packages/core/ui/layouts/index.d.ts
@@ -6,3 +6,5 @@ export { RootLayout, getRootLayout, getRootLayoutById, RootLayoutOptions, ShadeC
export { StackLayout } from './stack-layout';
export { WrapLayout } from './wrap-layout';
export { LayoutBase } from './layout-base';
+export { LiquidGlass } from './liquid-glass';
+export { LiquidGlassContainer } from './liquid-glass-container';
diff --git a/packages/core/ui/layouts/index.ts b/packages/core/ui/layouts/index.ts
index c9ebfc358..63f4ff143 100644
--- a/packages/core/ui/layouts/index.ts
+++ b/packages/core/ui/layouts/index.ts
@@ -7,3 +7,5 @@ export type { RootLayoutOptions, ShadeCoverOptions } from './root-layout';
export { StackLayout } from './stack-layout';
export { WrapLayout } from './wrap-layout';
export { LayoutBase } from './layout-base';
+export { LiquidGlass } from './liquid-glass';
+export { LiquidGlassContainer } from './liquid-glass-container';
diff --git a/packages/core/ui/layouts/liquid-glass-container/index.android.ts b/packages/core/ui/layouts/liquid-glass-container/index.android.ts
new file mode 100644
index 000000000..c3a7c2a35
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass-container/index.android.ts
@@ -0,0 +1,3 @@
+import { LiquidGlassContainerCommon } from './liquid-glass-container-common';
+
+export class LiquidGlassContainer extends LiquidGlassContainerCommon {}
diff --git a/packages/core/ui/layouts/liquid-glass-container/index.d.ts b/packages/core/ui/layouts/liquid-glass-container/index.d.ts
new file mode 100644
index 000000000..c3a7c2a35
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass-container/index.d.ts
@@ -0,0 +1,3 @@
+import { LiquidGlassContainerCommon } from './liquid-glass-container-common';
+
+export class LiquidGlassContainer extends LiquidGlassContainerCommon {}
diff --git a/packages/core/ui/layouts/liquid-glass-container/index.ios.ts b/packages/core/ui/layouts/liquid-glass-container/index.ios.ts
new file mode 100644
index 000000000..585805441
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass-container/index.ios.ts
@@ -0,0 +1,41 @@
+import type { NativeScriptUIView } from '../../utils';
+import { View } from '../../core/view';
+import { LiquidGlassContainerCommon } from './liquid-glass-container-common';
+
+export class LiquidGlassContainer extends LiquidGlassContainerCommon {
+ public nativeViewProtected: UIVisualEffectView;
+
+ createNativeView() {
+ const effect = UIGlassContainerEffect.alloc().init();
+ effect.spacing = 8;
+ const glassEffectView = UIVisualEffectView.alloc().initWithEffect(effect);
+ glassEffectView.overrideUserInterfaceStyle = UIUserInterfaceStyle.Dark;
+ glassEffectView.clipsToBounds = true;
+
+ return glassEffectView;
+ }
+
+ public _addViewToNativeVisualTree(child: View, atIndex: number): boolean {
+ const parentNativeView = this.nativeViewProtected;
+ const childNativeView: NativeScriptUIView = child.nativeViewProtected;
+
+ if (parentNativeView && childNativeView) {
+ if (typeof atIndex !== 'number' || atIndex >= parentNativeView.subviews.count) {
+ // parentNativeView.addSubview(childNativeView);
+ this.nativeViewProtected.contentView.addSubview(childNativeView);
+ } else {
+ // parentNativeView.insertSubviewAtIndex(childNativeView, atIndex);
+ this.nativeViewProtected.contentView.insertSubviewAtIndex(childNativeView, atIndex);
+ }
+
+ // Add outer shadow layer manually as it belongs to parent layer tree (this is needed for reusable views)
+ if (childNativeView.outerShadowContainerLayer && !childNativeView.outerShadowContainerLayer.superlayer) {
+ parentNativeView.layer.insertSublayerBelow(childNativeView.outerShadowContainerLayer, childNativeView.layer);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/packages/core/ui/layouts/liquid-glass-container/liquid-glass-container-common.ts b/packages/core/ui/layouts/liquid-glass-container/liquid-glass-container-common.ts
new file mode 100644
index 000000000..213181b19
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass-container/liquid-glass-container-common.ts
@@ -0,0 +1,3 @@
+import { GridLayout } from '../grid-layout';
+
+export class LiquidGlassContainerCommon extends GridLayout {}
diff --git a/packages/core/ui/layouts/liquid-glass/index.android.ts b/packages/core/ui/layouts/liquid-glass/index.android.ts
new file mode 100644
index 000000000..ebb419229
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass/index.android.ts
@@ -0,0 +1,3 @@
+import { LiquidGlassCommon } from './liquid-glass-common';
+
+export class LiquidGlass extends LiquidGlassCommon {}
diff --git a/packages/core/ui/layouts/liquid-glass/index.d.ts b/packages/core/ui/layouts/liquid-glass/index.d.ts
new file mode 100644
index 000000000..ebb419229
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass/index.d.ts
@@ -0,0 +1,3 @@
+import { LiquidGlassCommon } from './liquid-glass-common';
+
+export class LiquidGlass extends LiquidGlassCommon {}
diff --git a/packages/core/ui/layouts/liquid-glass/index.ios.ts b/packages/core/ui/layouts/liquid-glass/index.ios.ts
new file mode 100644
index 000000000..71b59ab77
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass/index.ios.ts
@@ -0,0 +1,41 @@
+import type { NativeScriptUIView } from '../../utils';
+import { View } from '../../core/view';
+import { LiquidGlassCommon } from './liquid-glass-common';
+
+export class LiquidGlass extends LiquidGlassCommon {
+ public nativeViewProtected: UIVisualEffectView;
+
+ createNativeView() {
+ const effect = UIGlassEffect.effectWithStyle(UIGlassEffectStyle.Clear);
+ effect.interactive = true;
+ const glassEffectView = UIVisualEffectView.alloc().initWithEffect(effect);
+ glassEffectView.overrideUserInterfaceStyle = UIUserInterfaceStyle.Dark;
+ glassEffectView.clipsToBounds = true;
+
+ return glassEffectView;
+ }
+
+ public _addViewToNativeVisualTree(child: View, atIndex: number): boolean {
+ const parentNativeView = this.nativeViewProtected;
+ const childNativeView: NativeScriptUIView = child.nativeViewProtected;
+
+ if (parentNativeView && childNativeView) {
+ if (typeof atIndex !== 'number' || atIndex >= parentNativeView.subviews.count) {
+ // parentNativeView.addSubview(childNativeView);
+ this.nativeViewProtected.contentView.addSubview(childNativeView);
+ } else {
+ // parentNativeView.insertSubviewAtIndex(childNativeView, atIndex);
+ this.nativeViewProtected.contentView.insertSubviewAtIndex(childNativeView, atIndex);
+ }
+
+ // Add outer shadow layer manually as it belongs to parent layer tree (this is needed for reusable views)
+ if (childNativeView.outerShadowContainerLayer && !childNativeView.outerShadowContainerLayer.superlayer) {
+ parentNativeView.layer.insertSublayerBelow(childNativeView.outerShadowContainerLayer, childNativeView.layer);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/packages/core/ui/layouts/liquid-glass/liquid-glass-common.ts b/packages/core/ui/layouts/liquid-glass/liquid-glass-common.ts
new file mode 100644
index 000000000..792f8dabc
--- /dev/null
+++ b/packages/core/ui/layouts/liquid-glass/liquid-glass-common.ts
@@ -0,0 +1,3 @@
+import { GridLayout } from '../grid-layout';
+
+export class LiquidGlassCommon extends GridLayout {}
diff --git a/packages/core/ui/text-base/index.ios.ts b/packages/core/ui/text-base/index.ios.ts
index 89a3b3319..c47969977 100644
--- a/packages/core/ui/text-base/index.ios.ts
+++ b/packages/core/ui/text-base/index.ios.ts
@@ -12,14 +12,12 @@ import { Span } from './span';
import { colorProperty, fontInternalProperty, fontScaleInternalProperty, Length } from '../styling/style-properties';
import { StrokeCSSValues } from '../styling/css-stroke';
import { isString, isNullOrUndefined } from '../../utils/types';
-import { iOSNativeHelper, layout } from '../../utils';
-import { Trace } from '../../trace';
+import { layout } from '../../utils';
+import { SDK_VERSION } from '../../utils/constants';
import { CoreTypes } from '../../core-types';
export * from './text-base-common';
-const majorVersion = iOSNativeHelper.MajorVersion;
-
@NativeClass
class UILabelClickHandlerImpl extends NSObject {
private _owner: WeakRef;
@@ -350,7 +348,7 @@ export class TextBase extends TextBaseCommon {
const text = getTransformedText(isNullOrUndefined(this.text) ? '' : `${this.text}`, this.textTransform);
this.nativeTextViewProtected.nativeScriptSetTextDecorationAndTransformTextDecorationLetterSpacingLineHeight(text, this.style.textDecoration || '', letterSpacing, lineHeight);
- if (!this.style?.color && majorVersion >= 13 && UIColor.labelColor) {
+ if (!this.style?.color && SDK_VERSION >= 13 && UIColor.labelColor) {
this._setColor(UIColor.labelColor);
}
}
diff --git a/tools/assets/App_Resources/iOS/bg1.jpg b/tools/assets/App_Resources/iOS/bg1.jpg
new file mode 100644
index 000000000..c2ca7fd5c
Binary files /dev/null and b/tools/assets/App_Resources/iOS/bg1.jpg differ
diff --git a/tools/assets/App_Resources/iOS/bg2.jpg b/tools/assets/App_Resources/iOS/bg2.jpg
new file mode 100644
index 000000000..5af3de5af
Binary files /dev/null and b/tools/assets/App_Resources/iOS/bg2.jpg differ
diff --git a/tools/assets/App_Resources/iOS/bg3.jpg b/tools/assets/App_Resources/iOS/bg3.jpg
new file mode 100644
index 000000000..9092862d9
Binary files /dev/null and b/tools/assets/App_Resources/iOS/bg3.jpg differ