Skip to content

Commit

Permalink
IOS Support
Browse files Browse the repository at this point in the history
  • Loading branch information
triniwiz committed Nov 10, 2016
1 parent 0027783 commit 16d459b
Show file tree
Hide file tree
Showing 14 changed files with 715 additions and 231 deletions.
20 changes: 20 additions & 0 deletions angular/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { ElementRef, TemplateRef, ViewContainerRef } from "@angular/core";
import { Pager } from "../pager";
export declare class PagerDirective {
private element;
pager: Pager;
private _selectedIndex;
private viewInitialized;
selectedIndex: number;
constructor(element: ElementRef);
ngAfterViewInit(): void;
}
export declare class PagerItemDirective {
private owner;
private templateRef;
private viewContainer;
private item;
constructor(owner: PagerDirective, templateRef: TemplateRef<any>, viewContainer: ViewContainerRef);
private ensureItem();
ngOnInit(): void;
}
78 changes: 78 additions & 0 deletions angular/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { ElementRef, Directive, Input, TemplateRef, ViewContainerRef } from "@angular/core";
import { Pager, PagerItem } from "../pager";
import { View } from "ui/core/view";
import * as platform from "platform";
@Directive({
selector: 'Pager',
inputs: ['selectedIndex']
})
export class PagerDirective {
public pager: Pager;
private _selectedIndex: number;
private viewInitialized: boolean;

get selectedIndex(): number {
return this._selectedIndex;
}

set selectedIndex(value) {
this._selectedIndex = value;
if (this.viewInitialized) {
this.pager.selectedIndex = this._selectedIndex;
}
}

constructor(private element: ElementRef) {
this.pager = element.nativeElement;
if (platform.isIOS) {
this.pager.items = [];
}
}

ngAfterViewInit() {
this.viewInitialized = true;
this.pager.selectedIndex = this._selectedIndex;
}
}

@Directive({
selector: '[pagerItem]'
})
export class PagerItemDirective {
private item: PagerItem;
constructor(
private owner: PagerDirective,
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) {
}

private ensureItem() {
if (!this.item) {
this.item = new PagerItem();
}
}

ngOnInit() {
this.ensureItem();

const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
//Filter out text nodes, etc
const realViews = viewRef.rootNodes.filter((node) =>
node.nodeName && node.nodeName !== '#text')
if (realViews.length > 0) {
if (platform.isIOS) {
this.item = realViews[0];
let newItems: Array<any> = (this.owner.pager.views || []).concat([this.item]);
this.owner.pager.views = newItems;
newItems.forEach((item, index) => {
this.owner.pager.items.push(item);
});
} else if (platform.isAndroid) {
this.item._addView(realViews[0]);
const newItems = (this.owner.pager.items || []).concat([this.item]);
this.owner.pager.items = newItems;
}
}
}
}
3 changes: 3 additions & 0 deletions angular/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"main": "index.js"
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "nativescript-pager",
"version": "1.1.0",
"version": "2.0.0",
"description": "",
"main": "pager.js",
"nativescript": {
Expand Down
22 changes: 1 addition & 21 deletions pager.android.d.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1 @@
import { StackLayout } from "ui/layouts/stack-layout";
import { Property } from "ui/core/dependency-observable";
export declare class Pager extends StackLayout {
private _androidViewId;
private _pagerAdapter;
private _transformer;
private _android;
private _disableSwipe;
static selectedIndexProperty: Property;
constructor();
disableSwipe: boolean;
readonly android: android.support.v4.view.ViewPager;
readonly _nativeView: android.support.v4.view.ViewPager;
readonly pagerAdapter: android.support.v4.view.PagerAdapter;
transformer: any;
selectedIndex: number;
_createUI(): void;
onLoaded(): void;
updateIndex(index: number): void;
runUpdate(): void;
}
export * from './src/android/pager';
200 changes: 1 addition & 199 deletions pager.android.ts
Original file line number Diff line number Diff line change
@@ -1,199 +1 @@
import { StackLayout } from "ui/layouts/stack-layout";
import { PropertyMetadataSettings, Property, PropertyChangeData } from "ui/core/dependency-observable";
import { PropertyMetadata } from "ui/core/proxy";
import { View } from "ui/core/view";
declare var com;
function onSelectedIndexChanged(data: PropertyChangeData) {
const item = <Pager>data.object;
item.updateIndex(item.selectedIndex);
}
export class Pager extends StackLayout {
private _androidViewId: number;
private _pagerAdapter: android.support.v4.view.PagerAdapter;
private _transformer;
private _android: android.support.v4.view.ViewPager;
private _disableSwipe: boolean;
public static selectedIndexProperty = new Property("selectedIndex", "Pager", new PropertyMetadata(undefined, PropertyMetadataSettings.None));
constructor() {
super();
}
get disableSwipe(): boolean {
return this._disableSwipe;
}
set disableSwipe(value: boolean) {
this._disableSwipe = value;
}
get android() {
return this._android;
}
get _nativeView() {
return this._android;
}
get pagerAdapter() {
return this._pagerAdapter;
}
set transformer(value) {
switch (value) {
case "AccordionTransformer":
this._transformer = com.eftimoff.viewpagertransformers.AccordionTransformer;
break;
case "BackgroundToForegroundTransformer":
this._transformer = com.eftimoff.viewpagertransformers.BackgroundToForegroundTransformer;
break;
case "CubeInTransformer":
this._transformer = com.eftimoff.viewpagertransformers.CubeInTransformer;
break;
case "CubeOutTransformer":
this._transformer = com.eftimoff.viewpagertransformers.CubeOutTransformer;
break;
case "DefaultTransformer":
this._transformer = com.eftimoff.viewpagertransformers.DefaultTransformer;
break;
case "DepthPageTransformer":
this._transformer = com.eftimoff.viewpagertransformers.DepthPageTransformer;
break;
case "DrawFromBackTransformer":
this._transformer = com.eftimoff.viewpagertransformers.DrawFromBackTransformer;
break;
case "FlipHorizontalTransformer":
this._transformer = com.eftimoff.viewpagertransformers.FlipHorizontalTransformer;
break;
case "FlipVerticalTransformer":
this._transformer = com.eftimoff.viewpagertransformers.FlipVerticalTransformer;
break;
case "ForegroundToBackgroundTransformer":
this._transformer = com.eftimoff.viewpagertransformers.ForegroundToBackgroundTransformer;
break;
case "RotateDownTransformer":
this._transformer = com.eftimoff.viewpagertransformers.RotateDownTransformer;
break;
case "RotateUpTransformer":
this._transformer = com.eftimoff.viewpagertransformers.RotateUpTransformer;
break;
case "StackTransformer":
this._transformer = com.eftimoff.viewpagertransformers.StackTransformer;
break;
case "TabletTransformer":
this._transformer = com.eftimoff.viewpagertransformers.TabletTransformer;
break;
case "ZoomInTransformer":
this._transformer = com.eftimoff.viewpagertransformers.ZoomInTransformer;
break;
case "ZoomOutSlideTransformer":
this._transformer = com.eftimoff.viewpagertransformers.ZoomOutSlideTransformer;
break;
case "ZoomOutTranformer":
this._transformer = com.eftimoff.viewpagertransformers.ZoomOutTranformer;
break;
}
}
get transformer() {
return this._transformer;
}
get selectedIndex() {
return this._getValue(Pager.selectedIndexProperty);
}
set selectedIndex(value: number) {
this._setValue(Pager.selectedIndexProperty, value);
}
_createUI() {
if (!this._androidViewId) {
this._androidViewId = android.view.View.generateViewId();
};
if (this.disableSwipe) {
this._android = new TNSViewPager(this._context, true); //new android.support.v4.view.ViewPager(this._context);
} else {
this._android = new TNSViewPager(this._context); //new android.support.v4.view.ViewPager(this._context);
}

this._android.setId(this._androidViewId);
}

onLoaded() {
super.onLoaded();
const that = new WeakRef(this);
this._pagerAdapter = new PagerAdapter(this);
this._android.addOnPageChangeListener(new android.support.v4.view.ViewPager.OnPageChangeListener({
onPageSelected: function (position: number) {
that.get().selectedIndex = position;
},
onPageScrolled: function (position, positionOffset, positionOffsetPixels) {
},
onPageScrollStateChanged: function (state) {
}
}));
this._android.setAdapter(this._pagerAdapter);
if (this.transformer) {
this._android.setPageTransformer(false, new this._transformer());
}
if (this.selectedIndex) {
this._android.setCurrentItem(this.selectedIndex);
}
}
updateIndex(index: number) {
if (this._android && index) {
this._android.setCurrentItem(index);
}
}
runUpdate() {
if (this._android.getChildAt(0) instanceof org.nativescript.widgets.ContentLayout) {
this._android.removeViewAt(0);
}
this._pagerAdapter.notifyDataSetChanged();
if (this._pagerAdapter.getCount() > 0) {
this._android.setOffscreenPageLimit(this._pagerAdapter.getCount());
}

}

}
Pager.selectedIndexProperty.onValueChanged = onSelectedIndexChanged;
class PagerAdapter extends android.support.v4.view.PagerAdapter {
private owner: Pager;
constructor(owner) {
super();
this.owner = owner;
return global.__native(this);
}

instantiateItem(collection: android.view.ViewGroup, position: number) {
return this.owner.android.getChildAt(position);
}

destroyItem(container: android.view.ViewGroup, position: number, object) {
container.removeView(object);
}
getCount(): number {

return this.owner.android ? this.owner.android.getChildCount() : 0;
}
isViewFromObject(view: android.view.View, object) {
return view === object;
}
}

class TNSViewPager extends android.support.v4.view.ViewPager {
disableSwipe: boolean;
constructor(context, disableSwipe?: boolean) {
super(context);
if (disableSwipe) {
this.disableSwipe = disableSwipe;
}
return global.__native(this);
}
onInterceptTouchEvent(ev) {
if (this.disableSwipe) {
return false;
} else {
return super.onInterceptTouchEvent(ev);
}
}
onTouchEvent(ev) {
if (this.disableSwipe) {
return false;
}
else {
return super.onTouchEvent(ev);
}
}
}
export * from './src/android/pager';
5 changes: 1 addition & 4 deletions pager.ios.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
import { StackLayout } from "ui/layouts/stack-layout";
export declare class Pager extends StackLayout {
constructor();
}
export * from './src/ios/pager';
7 changes: 1 addition & 6 deletions pager.ios.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1 @@
import { StackLayout } from "ui/layouts/stack-layout";
export class Pager extends StackLayout {
constructor() {
super();
}
}
export * from './src/ios/pager';
24 changes: 24 additions & 0 deletions src/android/pager.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Property } from "ui/core/dependency-observable";
import { View } from "ui/core/view";
import * as common from "../common";
export declare class Pager extends common.Pager {
private _android;
private _pagerAdapter;
private _views;
private _transformer;
static pagesCountProperty: Property;
constructor();
readonly android: android.support.v4.view.ViewPager;
pagesCount: number;
readonly _nativeView: android.support.v4.view.ViewPager;
_createUI(): void;
updateIndex(index: number): void;
updatePagesCount(value: number): void;
updateItems(oldItems: Array<View>, newItems: Array<View>): void;
readonly _childrenCount: number;
_eachChildView(callback: (child: View) => boolean): void;
transformer: any;
}
export declare class PagerItem extends common.PagerItem {
constructor();
}
Loading

0 comments on commit 16d459b

Please sign in to comment.