jsbox-cview 1.5.21 → 1.5.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/alert/input-alert.ts +5 -7
- package/components/alert/login-alert.ts +7 -7
- package/components/alert/plain-alert.ts +3 -3
- package/components/alert/uialert.ts +14 -6
- package/components/base.ts +12 -8
- package/components/custom-navigation-bar.ts +106 -88
- package/components/dialogs/dialog-sheet.ts +12 -8
- package/components/dialogs/form-dialog.ts +29 -16
- package/components/dialogs/list-dialog.ts +26 -20
- package/components/dialogs/text-dialog.ts +13 -8
- package/components/dynamic-contextmenu-view.ts +57 -25
- package/components/dynamic-itemsize-matrix.ts +45 -40
- package/components/dynamic-preference-listview.ts +135 -117
- package/components/dynamic-rowheight-list.ts +32 -20
- package/components/enhanced-imageview.ts +37 -28
- package/components/flowlayout.ts +61 -42
- package/components/image-pager.ts +33 -29
- package/components/page-control.ts +15 -11
- package/components/pageviewer-titlebar.ts +29 -22
- package/components/pageviewer.ts +33 -23
- package/components/refresh-button.ts +8 -8
- package/components/rotating-view.ts +24 -20
- package/components/searchbar.ts +113 -65
- package/components/sheet.ts +23 -17
- package/components/single-views.ts +228 -72
- package/components/spinners/loading-dual-ring.ts +21 -15
- package/components/spinners/loading-wedges.ts +24 -18
- package/components/spinners/spinner-androidstyle.ts +58 -47
- package/components/static-preference-listview.ts +197 -151
- package/components/symbol-button.ts +23 -22
- package/components/tabbar.ts +80 -64
- package/controller/base-controller.ts +42 -35
- package/controller/controller-router.ts +4 -4
- package/controller/pageviewer-controller.ts +41 -27
- package/controller/presented-page-controller.ts +27 -15
- package/controller/splitview-controller.ts +77 -44
- package/controller/tabbar-controller.ts +33 -23
- package/dist/components/alert/input-alert.js +3 -3
- package/dist/components/alert/login-alert.js +5 -5
- package/dist/components/alert/plain-alert.js +1 -1
- package/dist/components/alert/uialert.js +4 -4
- package/dist/components/base.js +2 -1
- package/dist/components/custom-navigation-bar.js +61 -59
- package/dist/components/dialogs/dialog-sheet.js +5 -5
- package/dist/components/dialogs/form-dialog.js +2 -2
- package/dist/components/dialogs/list-dialog.js +15 -15
- package/dist/components/dialogs/text-dialog.js +6 -6
- package/dist/components/dynamic-contextmenu-view.js +11 -8
- package/dist/components/dynamic-itemsize-matrix.js +15 -13
- package/dist/components/dynamic-preference-listview.js +95 -90
- package/dist/components/dynamic-rowheight-list.js +7 -6
- package/dist/components/enhanced-imageview.js +18 -16
- package/dist/components/flowlayout.js +15 -14
- package/dist/components/image-pager.js +22 -21
- package/dist/components/page-control.js +2 -2
- package/dist/components/pageviewer-titlebar.js +20 -17
- package/dist/components/pageviewer.js +13 -12
- package/dist/components/refresh-button.js +5 -5
- package/dist/components/rotating-view.js +11 -11
- package/dist/components/searchbar.js +53 -41
- package/dist/components/sheet.js +4 -4
- package/dist/components/single-views.js +68 -68
- package/dist/components/spinners/loading-dual-ring.js +10 -10
- package/dist/components/spinners/loading-wedges.js +15 -15
- package/dist/components/spinners/spinner-androidstyle.js +45 -43
- package/dist/components/static-preference-listview.js +101 -102
- package/dist/components/symbol-button.js +14 -13
- package/dist/components/tabbar.js +54 -50
- package/dist/controller/base-controller.js +17 -14
- package/dist/controller/pageviewer-controller.js +13 -11
- package/dist/controller/presented-page-controller.js +6 -4
- package/dist/controller/splitview-controller.js +48 -31
- package/dist/controller/tabbar-controller.js +13 -12
- package/dist/test/custom-navigation-bar.js +11 -9
- package/dist/test/dynamic-contextmenu-view.js +16 -14
- package/dist/test/dynamic-itemsize-matrix.js +18 -17
- package/dist/test/dynamic-preference-listview.js +29 -29
- package/dist/test/flowlayout.js +33 -27
- package/dist/test/form-dialog.js +15 -13
- package/dist/test/pageviewer-controller.js +10 -7
- package/dist/test/pageviewer-titlebar.js +3 -3
- package/dist/test/pageviewer.js +16 -7
- package/dist/test/refresh-button.js +4 -4
- package/dist/test/searchbar.js +7 -7
- package/dist/test/splitview-controller.js +14 -11
- package/dist/test/static-preference-listview.js +29 -30
- package/dist/test/tabbar-controller.js +15 -12
- package/dist/utils/colors.js +1 -2
- package/dist/utils/l10n.js +28 -28
- package/dist/utils/path.js +2 -2
- package/dist/utils/rect.js +30 -8
- package/dist/utils/uitools.js +29 -19
- package/index.ts +43 -43
- package/package.json +2 -2
- package/test/custom-navigation-bar.ts +28 -28
- package/test/dynamic-contextmenu-view.ts +23 -21
- package/test/dynamic-itemsize-matrix.ts +27 -22
- package/test/dynamic-preference-listview.ts +35 -35
- package/test/flowlayout.ts +43 -33
- package/test/form-dialog.ts +44 -43
- package/test/pageviewer-controller.ts +13 -11
- package/test/pageviewer-titlebar.ts +4 -5
- package/test/pageviewer.ts +17 -8
- package/test/refresh-button.ts +5 -5
- package/test/searchbar.ts +8 -8
- package/test/splitview-controller.ts +31 -30
- package/test/static-preference-listview.ts +35 -34
- package/test/tabbar-controller.ts +32 -29
- package/utils/colors.ts +7 -8
- package/utils/cvid.ts +1 -2
- package/utils/l10n.ts +32 -32
- package/utils/path.ts +9 -9
- package/utils/rect.ts +31 -8
- package/utils/uitools.ts +30 -22
|
@@ -7,7 +7,8 @@ const base_1 = require("./base");
|
|
|
7
7
|
*
|
|
8
8
|
* 可以自动更新 rowHeight 的 list
|
|
9
9
|
*
|
|
10
|
-
* 核心策略为 list 的所有行均为 cview,且每一个 cview 需要实现一个方法:
|
|
10
|
+
* 核心策略为 list 的所有行均为 cview,且每一个 cview 需要实现一个方法:
|
|
11
|
+
* heightToWidth(width: number) => number
|
|
11
12
|
* 通过这个方法汇报自己在某个宽度的时候所需要的高度,这必须任何时候均立即可用;
|
|
12
13
|
*
|
|
13
14
|
* 特别参数
|
|
@@ -18,18 +19,18 @@ const base_1 = require("./base");
|
|
|
18
19
|
* 除了 props.data, props.template 和 events.rowHeight 不可用,其他均和 list 一致
|
|
19
20
|
*/
|
|
20
21
|
class DynamicRowHeightList extends base_1.Base {
|
|
21
|
-
constructor({ sections, rows, props, layout, events }) {
|
|
22
|
+
constructor({ sections, rows, props, layout, events, }) {
|
|
22
23
|
super();
|
|
23
24
|
this._defineView = () => {
|
|
24
25
|
let data;
|
|
25
26
|
if (sections && sections.length > 0) {
|
|
26
|
-
data = sections.map(n => ({
|
|
27
|
+
data = sections.map((n) => ({
|
|
27
28
|
title: n.title,
|
|
28
|
-
rows: n.rows.map(r => r.definition)
|
|
29
|
+
rows: n.rows.map((r) => r.definition),
|
|
29
30
|
}));
|
|
30
31
|
}
|
|
31
32
|
else if (rows && rows.length > 0) {
|
|
32
|
-
data = rows.map(r => r.definition);
|
|
33
|
+
data = rows.map((r) => r.definition);
|
|
33
34
|
}
|
|
34
35
|
else {
|
|
35
36
|
throw new Error("sections or rows must be provided");
|
|
@@ -49,7 +50,7 @@ class DynamicRowHeightList extends base_1.Base {
|
|
|
49
50
|
else {
|
|
50
51
|
throw new Error("sections or rows must be provided");
|
|
51
52
|
}
|
|
52
|
-
} }, events)
|
|
53
|
+
} }, events),
|
|
53
54
|
};
|
|
54
55
|
};
|
|
55
56
|
}
|
|
@@ -11,7 +11,8 @@ const cvid_1 = require("../utils/cvid");
|
|
|
11
11
|
*
|
|
12
12
|
* 请注意:此组件使用了Runtime代码重新设置了Tapped事件。
|
|
13
13
|
* 与以前使用touchesEnded事件来实现相比,可以避免在滑动手指时误触发。
|
|
14
|
-
* 但因此带来了副作用:必须在关闭前通过releaseGestureObject释放掉此视图中自定义的NSObject
|
|
14
|
+
* 但因此带来了副作用:必须在关闭前通过releaseGestureObject释放掉此视图中自定义的NSObject,
|
|
15
|
+
* 否则再次启动可能会有问题。
|
|
15
16
|
*
|
|
16
17
|
* Props:
|
|
17
18
|
* src: string, 图片地址
|
|
@@ -22,14 +23,14 @@ const cvid_1 = require("../utils/cvid");
|
|
|
22
23
|
* lowerLocationTouched: (sender: EnhancedImageView) => void, 下半部分被点击
|
|
23
24
|
*/
|
|
24
25
|
class EnhancedImageView extends base_1.Base {
|
|
25
|
-
constructor({ props, layout, events = {} }) {
|
|
26
|
+
constructor({ props, layout, events = {}, }) {
|
|
26
27
|
super();
|
|
27
28
|
this._props = Object.assign({ maxZoomScale: 2 }, props);
|
|
28
29
|
this._scroll = new single_views_1.Scroll({
|
|
29
30
|
props: {
|
|
30
31
|
zoomEnabled: true,
|
|
31
32
|
doubleTapToZoom: false,
|
|
32
|
-
maxZoomScale: this._props.maxZoomScale
|
|
33
|
+
maxZoomScale: this._props.maxZoomScale,
|
|
33
34
|
},
|
|
34
35
|
layout: $layout.fill,
|
|
35
36
|
views: [
|
|
@@ -38,13 +39,13 @@ class EnhancedImageView extends base_1.Base {
|
|
|
38
39
|
props: {
|
|
39
40
|
id: "image",
|
|
40
41
|
src: this._props.src,
|
|
41
|
-
contentMode: 1
|
|
42
|
+
contentMode: 1,
|
|
42
43
|
},
|
|
43
|
-
layout: $layout.fill
|
|
44
|
-
}
|
|
44
|
+
layout: $layout.fill,
|
|
45
|
+
},
|
|
45
46
|
],
|
|
46
47
|
events: {
|
|
47
|
-
ready: view => {
|
|
48
|
+
ready: (view) => {
|
|
48
49
|
$delay(0.1, () => this._addGesture(view, (gesture) => {
|
|
49
50
|
const location = gesture.$locationInView(view.ocValue());
|
|
50
51
|
const realLocation = $point(location.x - view.bounds.x, location.y - view.bounds.y);
|
|
@@ -58,23 +59,23 @@ class EnhancedImageView extends base_1.Base {
|
|
|
58
59
|
events.lowerLocationTouched(this);
|
|
59
60
|
}
|
|
60
61
|
}));
|
|
61
|
-
}
|
|
62
|
-
}
|
|
62
|
+
},
|
|
63
|
+
},
|
|
63
64
|
});
|
|
64
65
|
this._defineView = () => {
|
|
65
66
|
return {
|
|
66
67
|
type: "view",
|
|
67
68
|
props: {
|
|
68
|
-
id: this.id
|
|
69
|
+
id: this.id,
|
|
69
70
|
},
|
|
70
71
|
views: [this._scroll.definition],
|
|
71
72
|
layout,
|
|
72
73
|
events: {
|
|
73
|
-
layoutSubviews: sender => {
|
|
74
|
+
layoutSubviews: (sender) => {
|
|
74
75
|
$delay(0.1, () => (this.src = this.src));
|
|
75
76
|
$delay(0.3, () => (this.src = this.src));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
77
|
+
},
|
|
78
|
+
},
|
|
78
79
|
};
|
|
79
80
|
};
|
|
80
81
|
}
|
|
@@ -83,11 +84,12 @@ class EnhancedImageView extends base_1.Base {
|
|
|
83
84
|
$define({
|
|
84
85
|
type: objectId + ": NSObject",
|
|
85
86
|
events: {
|
|
86
|
-
tapped: event
|
|
87
|
-
}
|
|
87
|
+
tapped: event,
|
|
88
|
+
},
|
|
88
89
|
});
|
|
89
90
|
const object = $objc(objectId).$new();
|
|
90
|
-
$objc_retain(object); //
|
|
91
|
+
$objc_retain(object); // 此步骤是必须的,否则将很快被系统释放掉,
|
|
92
|
+
// 但是必须在关闭时手动释放掉,否则再次启动可能会有问题
|
|
91
93
|
this._gestureObject = object;
|
|
92
94
|
const tapGestureRecognizer = $objc("UITapGestureRecognizer")
|
|
93
95
|
.$alloc()
|
|
@@ -6,7 +6,8 @@ const base_1 = require("./base");
|
|
|
6
6
|
* 流式布局:间距固定,项目高度固定但宽度不定,左对齐,自动换行,不能滚动。
|
|
7
7
|
*
|
|
8
8
|
* 注意事项:
|
|
9
|
-
* 1.
|
|
9
|
+
* 1. 此控件默认是可变高度的,但前提是布局中必须有关于高度的约束。
|
|
10
|
+
* 如果不需要可变高度,可以设置fixedHeight为true
|
|
10
11
|
* 1. 此控件的边缘是不留白的,这和Matrix不同
|
|
11
12
|
* 2. itemWidth 如果超过总宽度,会被设定为总宽度
|
|
12
13
|
* 3. maxRows 可以控制最大行数,如果超过则会被截断
|
|
@@ -32,7 +33,7 @@ const base_1 = require("./base");
|
|
|
32
33
|
* - get items(): FlowlayoutItem[] 获取子视图
|
|
33
34
|
*/
|
|
34
35
|
class Flowlayout extends base_1.Base {
|
|
35
|
-
constructor({ props, layout, events }) {
|
|
36
|
+
constructor({ props, layout, events, }) {
|
|
36
37
|
super();
|
|
37
38
|
this._width = 0;
|
|
38
39
|
this._props = props;
|
|
@@ -43,7 +44,7 @@ class Flowlayout extends base_1.Base {
|
|
|
43
44
|
didSelect: events === null || events === void 0 ? void 0 : events.didSelect,
|
|
44
45
|
didLongPress: events === null || events === void 0 ? void 0 : events.didLongPress,
|
|
45
46
|
flowlayout: this,
|
|
46
|
-
index
|
|
47
|
+
index,
|
|
47
48
|
}));
|
|
48
49
|
this._defineView = () => ({
|
|
49
50
|
type: "view",
|
|
@@ -53,16 +54,16 @@ class Flowlayout extends base_1.Base {
|
|
|
53
54
|
},
|
|
54
55
|
layout,
|
|
55
56
|
events: {
|
|
56
|
-
layoutSubviews: sender => {
|
|
57
|
+
layoutSubviews: (sender) => {
|
|
57
58
|
if (this._width !== sender.frame.width) {
|
|
58
59
|
this._width = sender.frame.width;
|
|
59
60
|
const height = this._layoutWrappers();
|
|
60
61
|
if (!this._props.fixedHeight)
|
|
61
62
|
sender.updateLayout((make) => make.height.equalTo(height));
|
|
62
63
|
}
|
|
63
|
-
}
|
|
64
|
+
},
|
|
64
65
|
},
|
|
65
|
-
views: this._wrappers.map(wrapper => wrapper.definition)
|
|
66
|
+
views: this._wrappers.map((wrapper) => wrapper.definition),
|
|
66
67
|
});
|
|
67
68
|
}
|
|
68
69
|
cell(index) {
|
|
@@ -81,11 +82,11 @@ class Flowlayout extends base_1.Base {
|
|
|
81
82
|
didSelect: (_a = this._events) === null || _a === void 0 ? void 0 : _a.didSelect,
|
|
82
83
|
didLongPress: (_b = this._events) === null || _b === void 0 ? void 0 : _b.didLongPress,
|
|
83
84
|
flowlayout: this,
|
|
84
|
-
index
|
|
85
|
+
index,
|
|
85
86
|
});
|
|
86
87
|
});
|
|
87
|
-
this.view.views.forEach(v => v.remove());
|
|
88
|
-
this._wrappers.forEach(wrapper => this.view.add(wrapper.definition));
|
|
88
|
+
this.view.views.forEach((v) => v.remove());
|
|
89
|
+
this._wrappers.forEach((wrapper) => this.view.add(wrapper.definition));
|
|
89
90
|
const height = this._layoutWrappers();
|
|
90
91
|
if (!this._props.fixedHeight)
|
|
91
92
|
this.view.updateLayout((make) => make.height.equalTo(height));
|
|
@@ -144,7 +145,7 @@ class Flowlayout extends base_1.Base {
|
|
|
144
145
|
}
|
|
145
146
|
exports.Flowlayout = Flowlayout;
|
|
146
147
|
class WrapperView extends base_1.Base {
|
|
147
|
-
constructor({ item, menu, didSelect, didLongPress, flowlayout, index }) {
|
|
148
|
+
constructor({ item, menu, didSelect, didLongPress, flowlayout, index, }) {
|
|
148
149
|
super();
|
|
149
150
|
this.item = item;
|
|
150
151
|
const props = {
|
|
@@ -160,15 +161,15 @@ class WrapperView extends base_1.Base {
|
|
|
160
161
|
props,
|
|
161
162
|
views: [item.definition],
|
|
162
163
|
events: {
|
|
163
|
-
tapped: sender => {
|
|
164
|
+
tapped: (sender) => {
|
|
164
165
|
if (didSelect)
|
|
165
166
|
didSelect(flowlayout, index, item);
|
|
166
167
|
},
|
|
167
|
-
longPressed: sender => {
|
|
168
|
+
longPressed: (sender) => {
|
|
168
169
|
if (didLongPress)
|
|
169
170
|
didLongPress(flowlayout, index, item);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
171
|
+
},
|
|
172
|
+
},
|
|
172
173
|
});
|
|
173
174
|
}
|
|
174
175
|
set frame(frame) {
|
|
@@ -6,7 +6,8 @@ const single_views_1 = require("./single-views");
|
|
|
6
6
|
/**
|
|
7
7
|
* 图片浏览组件
|
|
8
8
|
*
|
|
9
|
-
* 与内置的Gallery组件相比,ImagePager
|
|
9
|
+
* 与内置的Gallery组件相比,ImagePager组件可以动态刷新,
|
|
10
|
+
* 适用于图片数量较多的场景,以及需要动态加载图片列表的场景
|
|
10
11
|
*
|
|
11
12
|
*/
|
|
12
13
|
class ImagePager extends base_1.Base {
|
|
@@ -21,7 +22,7 @@ class ImagePager extends base_1.Base {
|
|
|
21
22
|
* - changed: (page: number) => void - 页码变化时触发
|
|
22
23
|
* - tapped: (sender: ImagePager) => void - 点击图片时触发
|
|
23
24
|
*/
|
|
24
|
-
constructor({ props, layout, events = {} }) {
|
|
25
|
+
constructor({ props, layout, events = {}, }) {
|
|
25
26
|
super();
|
|
26
27
|
this._props = Object.assign({ srcs: [], page: 0, doubleTapToZoom: true }, props);
|
|
27
28
|
this._pageLoadRecorder = {};
|
|
@@ -40,7 +41,7 @@ class ImagePager extends base_1.Base {
|
|
|
40
41
|
id: "scroll",
|
|
41
42
|
zoomEnabled: true,
|
|
42
43
|
maxZoomScale: 3,
|
|
43
|
-
doubleTapToZoom: this._props.doubleTapToZoom
|
|
44
|
+
doubleTapToZoom: this._props.doubleTapToZoom,
|
|
44
45
|
},
|
|
45
46
|
layout: $layout.fill,
|
|
46
47
|
views: [
|
|
@@ -48,20 +49,20 @@ class ImagePager extends base_1.Base {
|
|
|
48
49
|
type: "image",
|
|
49
50
|
props: {
|
|
50
51
|
id: "image",
|
|
51
|
-
contentMode: $contentMode.scaleAspectFit
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
]
|
|
52
|
+
contentMode: $contentMode.scaleAspectFit,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
57
58
|
},
|
|
58
|
-
data: this._props.srcs.map(n => {
|
|
59
|
+
data: this._props.srcs.map((n) => {
|
|
59
60
|
return { image: { src: n } };
|
|
60
|
-
})
|
|
61
|
+
}),
|
|
61
62
|
},
|
|
62
63
|
layout: $layout.fill,
|
|
63
64
|
events: {
|
|
64
|
-
ready: sender => {
|
|
65
|
+
ready: (sender) => {
|
|
65
66
|
// 如果没有此处的relayout,则会出现莫名其妙的bug
|
|
66
67
|
sender.relayout();
|
|
67
68
|
if (!this._matrix.view)
|
|
@@ -84,22 +85,22 @@ class ImagePager extends base_1.Base {
|
|
|
84
85
|
if (oldPage !== this.page && events.changed)
|
|
85
86
|
events.changed(this.page);
|
|
86
87
|
},
|
|
87
|
-
didScroll: sender => {
|
|
88
|
+
didScroll: (sender) => {
|
|
88
89
|
this.loadsrc(this.page + 1, true);
|
|
89
90
|
this.loadsrc(this.page - 1, true);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
91
|
+
},
|
|
92
|
+
},
|
|
92
93
|
});
|
|
93
94
|
this._defineView = () => {
|
|
94
95
|
return {
|
|
95
96
|
type: "view",
|
|
96
97
|
props: {
|
|
97
|
-
id: this.id
|
|
98
|
+
id: this.id,
|
|
98
99
|
},
|
|
99
100
|
layout,
|
|
100
101
|
views: [this._matrix.definition],
|
|
101
102
|
events: {
|
|
102
|
-
layoutSubviews: sender => {
|
|
103
|
+
layoutSubviews: (sender) => {
|
|
103
104
|
this._pageLoadRecorder = {};
|
|
104
105
|
sender.relayout();
|
|
105
106
|
if (!this._matrix.view)
|
|
@@ -108,8 +109,8 @@ class ImagePager extends base_1.Base {
|
|
|
108
109
|
this.page = this.page;
|
|
109
110
|
$delay(0.1, () => this.loadsrc(this.page, true));
|
|
110
111
|
$delay(0.3, () => this.loadsrc(this.page, true));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
112
|
+
},
|
|
113
|
+
},
|
|
113
114
|
};
|
|
114
115
|
};
|
|
115
116
|
}
|
|
@@ -139,14 +140,14 @@ class ImagePager extends base_1.Base {
|
|
|
139
140
|
set page(page) {
|
|
140
141
|
this._matrix.view.scrollTo({
|
|
141
142
|
indexPath: $indexPath(0, page),
|
|
142
|
-
animated: false
|
|
143
|
+
animated: false,
|
|
143
144
|
});
|
|
144
145
|
this._props.page = page;
|
|
145
146
|
}
|
|
146
147
|
scrollToPage(page) {
|
|
147
148
|
this._matrix.view.scrollTo({
|
|
148
149
|
indexPath: $indexPath(0, page),
|
|
149
|
-
animated: true
|
|
150
|
+
animated: true,
|
|
150
151
|
});
|
|
151
152
|
this._props.page = page;
|
|
152
153
|
}
|
|
@@ -35,7 +35,7 @@ class PageControl extends single_views_1.Runtime {
|
|
|
35
35
|
* - changed: (sender: PageControl, currentPage: number) => void
|
|
36
36
|
*
|
|
37
37
|
*/
|
|
38
|
-
constructor({ props, layout, events = {} }) {
|
|
38
|
+
constructor({ props, layout, events = {}, }) {
|
|
39
39
|
const { numberOfPages = 3, currentPage = 0, pageIndicatorTintColor, currentPageIndicatorTintColor } = props, restProps = __rest(props, ["numberOfPages", "currentPage", "pageIndicatorTintColor", "currentPageIndicatorTintColor"]);
|
|
40
40
|
const { changed } = events, restEvents = __rest(events, ["changed"]);
|
|
41
41
|
super({ props: restProps, layout, events: restEvents });
|
|
@@ -63,7 +63,7 @@ class PageControl extends single_views_1.Runtime {
|
|
|
63
63
|
this._currentPage = currentPage;
|
|
64
64
|
if (this._changed)
|
|
65
65
|
this._changed(this, currentPage);
|
|
66
|
-
})
|
|
66
|
+
}),
|
|
67
67
|
});
|
|
68
68
|
return pageControl;
|
|
69
69
|
}
|
|
@@ -36,12 +36,13 @@ class PageViewerTitleBar extends base_1.Base {
|
|
|
36
36
|
* @param events 事件
|
|
37
37
|
* - changed: (cview, index) => void 在点击变更 index 的时候回调
|
|
38
38
|
*/
|
|
39
|
-
constructor({ props, layout, events = {} }) {
|
|
39
|
+
constructor({ props, layout, events = {}, }) {
|
|
40
40
|
super();
|
|
41
41
|
this._props = Object.assign({ index: 0, selectedItemColor: $color("systemLink"), defaultItemColor: $color("secondaryText") }, props);
|
|
42
42
|
const { changed } = events, restEvents = __rest(events, ["changed"]);
|
|
43
43
|
this._floatedIndex = this._props.index;
|
|
44
|
-
this._lineStartLocationPercentage =
|
|
44
|
+
this._lineStartLocationPercentage =
|
|
45
|
+
this._floatedIndex / this._props.items.length;
|
|
45
46
|
this.labels = this._props.items.map((n, i) => {
|
|
46
47
|
return new single_views_1.Label({
|
|
47
48
|
props: {
|
|
@@ -51,15 +52,15 @@ class PageViewerTitleBar extends base_1.Base {
|
|
|
51
52
|
? this._props.selectedItemColor
|
|
52
53
|
: this._props.defaultItemColor,
|
|
53
54
|
align: $align.center,
|
|
54
|
-
userInteractionEnabled: true
|
|
55
|
+
userInteractionEnabled: true,
|
|
55
56
|
},
|
|
56
57
|
events: {
|
|
57
|
-
tapped: sender => {
|
|
58
|
+
tapped: (sender) => {
|
|
58
59
|
this.index = i;
|
|
59
60
|
if (changed)
|
|
60
61
|
changed(this, i);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
62
|
+
},
|
|
63
|
+
},
|
|
63
64
|
});
|
|
64
65
|
});
|
|
65
66
|
this.stack = new single_views_1.Stack({
|
|
@@ -67,44 +68,46 @@ class PageViewerTitleBar extends base_1.Base {
|
|
|
67
68
|
axis: $stackViewAxis.horizontal,
|
|
68
69
|
distribution: $stackViewDistribution.fillEqually,
|
|
69
70
|
stack: {
|
|
70
|
-
views: this.labels.map(n => n.definition)
|
|
71
|
-
}
|
|
71
|
+
views: this.labels.map((n) => n.definition),
|
|
72
|
+
},
|
|
72
73
|
},
|
|
73
|
-
layout: $layout.fill
|
|
74
|
+
layout: $layout.fill,
|
|
74
75
|
});
|
|
75
76
|
this.placeholderView = new single_views_1.ContentView({
|
|
76
77
|
props: {
|
|
77
|
-
bgcolor: $color("clear")
|
|
78
|
+
bgcolor: $color("clear"),
|
|
78
79
|
},
|
|
79
80
|
layout: (make, view) => {
|
|
80
81
|
make.left.bottom.inset(0);
|
|
81
|
-
make.width
|
|
82
|
-
|
|
82
|
+
make.width
|
|
83
|
+
.equalTo(view.super)
|
|
84
|
+
.multipliedBy(this._floatedIndex / this._props.items.length);
|
|
85
|
+
},
|
|
83
86
|
});
|
|
84
87
|
this.line = new single_views_1.ContentView({
|
|
85
88
|
props: {
|
|
86
|
-
bgcolor: this._props.selectedItemColor
|
|
89
|
+
bgcolor: this._props.selectedItemColor,
|
|
87
90
|
},
|
|
88
91
|
layout: (make, view) => {
|
|
89
92
|
make.height.equalTo(4);
|
|
90
93
|
make.width.equalTo(view.super).dividedBy(this._props.items.length);
|
|
91
94
|
make.bottom.inset(0);
|
|
92
95
|
make.left.equalTo(view.prev.right);
|
|
93
|
-
}
|
|
96
|
+
},
|
|
94
97
|
});
|
|
95
98
|
this._defineView = () => {
|
|
96
99
|
return {
|
|
97
100
|
type: "view",
|
|
98
101
|
props: {
|
|
99
|
-
id: this.id
|
|
102
|
+
id: this.id,
|
|
100
103
|
},
|
|
101
104
|
layout,
|
|
102
105
|
events: restEvents,
|
|
103
106
|
views: [
|
|
104
107
|
this.stack.definition,
|
|
105
108
|
this.placeholderView.definition,
|
|
106
|
-
this.line.definition
|
|
107
|
-
]
|
|
109
|
+
this.line.definition,
|
|
110
|
+
],
|
|
108
111
|
};
|
|
109
112
|
};
|
|
110
113
|
}
|
|
@@ -4,7 +4,8 @@ exports.PageViewer = void 0;
|
|
|
4
4
|
const base_1 = require("./base");
|
|
5
5
|
const single_views_1 = require("./single-views");
|
|
6
6
|
/**
|
|
7
|
-
* 与JSBox内置的Gallery
|
|
7
|
+
* 与JSBox内置的Gallery功能类似,但是效果更好,可以伴随翻页实现联动效果
|
|
8
|
+
* 参见[pageviewer-titlebar.ts](./pageviewer-titlebar.ts)
|
|
8
9
|
*
|
|
9
10
|
* @property page: number 当前页码(无动画效果)
|
|
10
11
|
* @method scrollToPage(page: number) 滚动到某一页(带有动画效果)
|
|
@@ -20,20 +21,20 @@ class PageViewer extends base_1.Base {
|
|
|
20
21
|
* - changed: (cview, page) => void 页面改变时回调
|
|
21
22
|
* - floatPageChanged: (cview, floatPage) => void 滚动时回调(用于绑定其他联合滚动的控件)
|
|
22
23
|
*/
|
|
23
|
-
constructor({ props, layout, events = {} }) {
|
|
24
|
+
constructor({ props, layout, events = {}, }) {
|
|
24
25
|
super();
|
|
25
26
|
this._props = Object.assign({ page: 0 }, props);
|
|
26
27
|
this._events = events;
|
|
27
28
|
this._pageWidth = 0;
|
|
28
29
|
this._floatPage = this._props.page;
|
|
29
|
-
const contentViews = this._props.cviews.map(n => {
|
|
30
|
+
const contentViews = this._props.cviews.map((n) => {
|
|
30
31
|
return new single_views_1.ContentView({
|
|
31
32
|
views: [n.definition],
|
|
32
33
|
layout: (make, view) => {
|
|
33
34
|
make.height.width.equalTo(view.super);
|
|
34
35
|
make.left.equalTo(view.prev ? view.prev.right : view.super);
|
|
35
36
|
make.top.equalTo(view.super);
|
|
36
|
-
}
|
|
37
|
+
},
|
|
37
38
|
});
|
|
38
39
|
});
|
|
39
40
|
this.scroll = new single_views_1.Scroll({
|
|
@@ -41,10 +42,10 @@ class PageViewer extends base_1.Base {
|
|
|
41
42
|
alwaysBounceVertical: false,
|
|
42
43
|
alwaysBounceHorizontal: true,
|
|
43
44
|
showsHorizontalIndicator: false,
|
|
44
|
-
pagingEnabled: true
|
|
45
|
+
pagingEnabled: true,
|
|
45
46
|
},
|
|
46
47
|
events: {
|
|
47
|
-
layoutSubviews: sender => {
|
|
48
|
+
layoutSubviews: (sender) => {
|
|
48
49
|
this._pageWidth = sender.frame.width;
|
|
49
50
|
if (this._pageWidth)
|
|
50
51
|
sender.contentSize = $size(this._pageWidth * this._props.cviews.length, 0);
|
|
@@ -55,15 +56,15 @@ class PageViewer extends base_1.Base {
|
|
|
55
56
|
if (oldPage !== this.page && this._events.changed)
|
|
56
57
|
this._events.changed(this, this.page);
|
|
57
58
|
},
|
|
58
|
-
didScroll: sender => {
|
|
59
|
+
didScroll: (sender) => {
|
|
59
60
|
const rawPage = sender.contentOffset.x / this._pageWidth;
|
|
60
61
|
this._floatPage = Math.min(Math.max(0, rawPage), this._props.cviews.length - 1);
|
|
61
62
|
if (this._events.floatPageChanged)
|
|
62
63
|
this._events.floatPageChanged(this, this._floatPage);
|
|
63
|
-
}
|
|
64
|
+
},
|
|
64
65
|
},
|
|
65
66
|
layout: $layout.fill,
|
|
66
|
-
views: [...contentViews.map(n => n.definition)]
|
|
67
|
+
views: [...contentViews.map((n) => n.definition)],
|
|
67
68
|
});
|
|
68
69
|
this._defineView = () => {
|
|
69
70
|
return {
|
|
@@ -72,12 +73,12 @@ class PageViewer extends base_1.Base {
|
|
|
72
73
|
layout,
|
|
73
74
|
views: [this.scroll.definition],
|
|
74
75
|
events: {
|
|
75
|
-
layoutSubviews: sender => {
|
|
76
|
+
layoutSubviews: (sender) => {
|
|
76
77
|
sender.relayout();
|
|
77
78
|
this.page = this.page;
|
|
78
79
|
$delay(0.2, () => (this.page = this.page));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
80
|
+
},
|
|
81
|
+
},
|
|
81
82
|
};
|
|
82
83
|
};
|
|
83
84
|
}
|
|
@@ -12,7 +12,7 @@ const base_1 = require("./base");
|
|
|
12
12
|
* - tapped
|
|
13
13
|
*/
|
|
14
14
|
class RefreshButton extends base_1.Base {
|
|
15
|
-
constructor({ props, layout, events = {} }) {
|
|
15
|
+
constructor({ props, layout, events = {}, }) {
|
|
16
16
|
super();
|
|
17
17
|
this._loading = false;
|
|
18
18
|
this._layout = layout;
|
|
@@ -41,7 +41,7 @@ class RefreshButton extends base_1.Base {
|
|
|
41
41
|
layout: (make, view) => {
|
|
42
42
|
make.edges.insets($insets(12.5, 12.5, 12.5, 12.5));
|
|
43
43
|
make.center.equalTo(view.super);
|
|
44
|
-
}
|
|
44
|
+
},
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
type: "spinner",
|
|
@@ -52,9 +52,9 @@ class RefreshButton extends base_1.Base {
|
|
|
52
52
|
},
|
|
53
53
|
layout: (make, view) => {
|
|
54
54
|
make.center.equalTo(view.super);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
]
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
58
|
};
|
|
59
59
|
};
|
|
60
60
|
}
|
|
@@ -23,7 +23,7 @@ class RotatingView extends base_1.Base {
|
|
|
23
23
|
* @param events 事件
|
|
24
24
|
* - ready?: (cview: RotatingView) => void 默认的ready事件是自动开始旋转;也可以手动指定其他效果
|
|
25
25
|
*/
|
|
26
|
-
constructor({ props, layout, events = {} }) {
|
|
26
|
+
constructor({ props, layout, events = {}, }) {
|
|
27
27
|
super();
|
|
28
28
|
this._props = Object.assign({ contentMode: 1, rps: 0.5, clockwise: true }, props);
|
|
29
29
|
this._rotatingFlag = false;
|
|
@@ -39,9 +39,9 @@ class RotatingView extends base_1.Base {
|
|
|
39
39
|
? this._props.image.alwaysTemplate
|
|
40
40
|
: this._props.image,
|
|
41
41
|
tintColor: this._props.tintColor,
|
|
42
|
-
contentMode: this._props.contentMode
|
|
42
|
+
contentMode: this._props.contentMode,
|
|
43
43
|
},
|
|
44
|
-
layout: $layout.fill
|
|
44
|
+
layout: $layout.fill,
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
this._defineView = () => {
|
|
@@ -50,16 +50,16 @@ class RotatingView extends base_1.Base {
|
|
|
50
50
|
props: Object.assign(Object.assign({}, this._props), { id: this.id }),
|
|
51
51
|
layout,
|
|
52
52
|
events: {
|
|
53
|
-
ready: sender => {
|
|
53
|
+
ready: (sender) => {
|
|
54
54
|
if (events.ready) {
|
|
55
55
|
events.ready(this);
|
|
56
56
|
}
|
|
57
57
|
else {
|
|
58
58
|
this.startRotating();
|
|
59
59
|
}
|
|
60
|
-
}
|
|
60
|
+
},
|
|
61
61
|
},
|
|
62
|
-
views: [this._innerView.definition]
|
|
62
|
+
views: [this._innerView.definition],
|
|
63
63
|
};
|
|
64
64
|
};
|
|
65
65
|
}
|
|
@@ -77,14 +77,14 @@ class RotatingView extends base_1.Base {
|
|
|
77
77
|
duration,
|
|
78
78
|
options: 3 << 16,
|
|
79
79
|
animation: () => {
|
|
80
|
-
view.rotate(Math.PI * 2 / 3 * clockwiseMultiplier);
|
|
80
|
+
view.rotate(((Math.PI * 2) / 3) * clockwiseMultiplier);
|
|
81
81
|
},
|
|
82
82
|
completion: () => {
|
|
83
83
|
$ui.animate({
|
|
84
84
|
duration,
|
|
85
85
|
options: 3 << 16,
|
|
86
86
|
animation: () => {
|
|
87
|
-
view.rotate(Math.PI * 4 / 3 * clockwiseMultiplier);
|
|
87
|
+
view.rotate(((Math.PI * 4) / 3) * clockwiseMultiplier);
|
|
88
88
|
},
|
|
89
89
|
completion: () => {
|
|
90
90
|
$ui.animate({
|
|
@@ -96,11 +96,11 @@ class RotatingView extends base_1.Base {
|
|
|
96
96
|
completion: () => {
|
|
97
97
|
if (this._rotatingFlag)
|
|
98
98
|
this._rotateView(view);
|
|
99
|
-
}
|
|
99
|
+
},
|
|
100
100
|
});
|
|
101
|
-
}
|
|
101
|
+
},
|
|
102
102
|
});
|
|
103
|
-
}
|
|
103
|
+
},
|
|
104
104
|
});
|
|
105
105
|
}
|
|
106
106
|
}
|