tgios 0.0.37 → 0.0.38
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/tgios/beacon_manager.rb +116 -29
- data/lib/tgios/image_loader.rb +1 -1
- data/lib/tgios/photo_controller.rb +5 -10
- data/lib/tgios/scan_qr_controller.rb +36 -2
- data/lib/tgios/search_controller.rb +11 -1
- data/lib/tgios/table_section_list_binding.rb +40 -2
- data/lib/tgios/ui_collection_view_binding.rb +12 -0
- data/lib/tgios/ui_table_view_list_binding.rb +38 -13
- data/lib/tgios/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MTIzZDUyZTdiNGY4ZGQwODBjNTI2ZDk2ZTkyN2NmZTNhNGEzNzI5ZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YzRlYWViYjJlYjBlYzk4YzBjY2M1YzAzMTgyOGQ3OGM2ODkwMTEzMg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDZhMDk5Mjk0OTIxOGNlNDYzMzJmM2JiNzRmNDY3ZTU1OTE1NGYyNTUwMGMy
|
10
|
+
NTFmN2RlNTg4ZDllZjMzYmFiZmQyNmI4ZGVmMWNlZDVhNDZjNGYzYjRkZDE3
|
11
|
+
NTQzYjNjNWFmMzVhNzk3N2RlODJiMjBlOTQ3MmFlNzc4NTU1ZGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2U3MzU2M2FhYzllMjUzYThmMzYxNjM0NjU5YjJlM2JhMzEzOGVkYjkxMWMy
|
14
|
+
N2I3ZDRkNzJkYjZlMDgwNTlhZTczOGVjY2ZiYzMxZGExNzE1Y2NkMjk1NDhi
|
15
|
+
MmQwZjliYTNiNGY2ZTNiZTY2ODM1NDUxYjJiOWFiZTNhZDNjY2Q=
|
data/lib/tgios/beacon_manager.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
module Tgios
|
7
7
|
class FakeBeacon
|
8
|
-
attr_accessor :proximityUUID, :major, :minor
|
8
|
+
attr_accessor :proximityUUID, :major, :minor, :accuracy, :proximity, :rssi
|
9
9
|
|
10
10
|
def initialize(attributes)
|
11
11
|
attributes.each do |k, v|
|
@@ -17,8 +17,10 @@ module Tgios
|
|
17
17
|
|
18
18
|
class BeaconManager < BindingBase
|
19
19
|
attr_accessor :range_method, :range_limit, :tolerance, :current_beacon, :background
|
20
|
+
ALGORITHMS = [:continue, :timeout]
|
20
21
|
|
21
22
|
BeaconFoundKey = 'Tgios::BeaconManager::BeaconFound'
|
23
|
+
BeaconsFoundKey = 'Tgios::BeaconManager::BeaconsFound'
|
22
24
|
EnterRegionKey = 'Tgios::BeaconManager::EnterRegion'
|
23
25
|
ExitRegionKey = 'Tgios::BeaconManager::ExitRegion'
|
24
26
|
|
@@ -30,17 +32,36 @@ module Tgios
|
|
30
32
|
@default
|
31
33
|
end
|
32
34
|
|
33
|
-
|
35
|
+
#############################################
|
36
|
+
# range_method: :rssi or :accuracy
|
37
|
+
# range_limit: around -70 for :rssi / around 1.5 (meters) for :accuracy
|
38
|
+
# background: range beacons when device is in background
|
39
|
+
# algorithm: :continue or :timeout
|
40
|
+
# tolerance: for algorithm continue: number of times a beacon is ranged continuously required to trigger beacon changed event, for algorithm timeout: time in seconds for a beacon marked as changed
|
41
|
+
#############################################
|
42
|
+
|
43
|
+
def initialize(options)
|
34
44
|
@events = {}
|
35
45
|
@previous_beacons = []
|
36
|
-
@
|
37
|
-
@
|
38
|
-
|
39
|
-
|
40
|
-
@
|
41
|
-
|
42
|
-
|
43
|
-
@
|
46
|
+
@beacons_last_seen_at = {}
|
47
|
+
@background = options[:background]
|
48
|
+
|
49
|
+
self.algorithm = (options[:algorithm] || :continue)
|
50
|
+
@tolerance = (options[:tolerance] || 5)
|
51
|
+
|
52
|
+
@uuid = NSUUID.alloc.initWithUUIDString(options[:uuid])
|
53
|
+
@major = options[:major]
|
54
|
+
@minor = options[:minor]
|
55
|
+
@range_method = (options[:range_method] || :rssi)
|
56
|
+
@range_limit = (options[:range_limit] || -70)
|
57
|
+
|
58
|
+
@region = if @major && @minor
|
59
|
+
CLBeaconRegion.alloc.initWithProximityUUID(@uuid, major: @major, minor: @minor, identifier: identifier)
|
60
|
+
elsif @major
|
61
|
+
CLBeaconRegion.alloc.initWithProximityUUID(@uuid, major: @major, identifier: identifier)
|
62
|
+
else
|
63
|
+
CLBeaconRegion.alloc.initWithProximityUUID(@uuid, identifier: identifier)
|
64
|
+
end
|
44
65
|
@region.notifyOnEntry = true
|
45
66
|
@region.notifyOnExit = true
|
46
67
|
@region.notifyEntryStateOnDisplay = true
|
@@ -49,6 +70,11 @@ module Tgios
|
|
49
70
|
|
50
71
|
UIApplicationWillEnterForegroundNotification.add_observer(self, 'on_enter_foreground:')
|
51
72
|
UIApplicationDidEnterBackgroundNotification.add_observer(self, 'on_enter_background:')
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
def identifier
|
77
|
+
[@uuid.UUIDString, @major, @minor].join('/')
|
52
78
|
end
|
53
79
|
|
54
80
|
def on(event_key,&block)
|
@@ -56,28 +82,35 @@ module Tgios
|
|
56
82
|
self
|
57
83
|
end
|
58
84
|
|
85
|
+
def algorithm=(val)
|
86
|
+
alg = val.to_s.to_sym
|
87
|
+
return unless alg.present?
|
88
|
+
if @algorithm != alg
|
89
|
+
@previous_beacons.clear
|
90
|
+
end
|
91
|
+
raise ArgumentError.new("Algorithm not found, valid algorithm are: [#{ALGORITHMS.join(', ')}]") unless ALGORITHMS.include?(alg)
|
92
|
+
|
93
|
+
@algorithm = alg
|
94
|
+
end
|
95
|
+
|
59
96
|
def locationManager(manager, didDetermineState: state, forRegion: region)
|
60
97
|
NSLog "didDetermineState #{state}"
|
61
98
|
if state == CLRegionStateInside
|
62
99
|
manager.startRangingBeaconsInRegion(region)
|
100
|
+
did_enter_region(region)
|
101
|
+
elsif state == CLRegionStateOutside
|
102
|
+
did_exit_region(region)
|
63
103
|
end
|
64
104
|
end
|
65
105
|
|
66
106
|
def locationManager(manager, didEnterRegion: region)
|
67
107
|
NSLog 'didEnterRegion'
|
68
|
-
|
69
|
-
manager.startRangingBeaconsInRegion(region)
|
70
|
-
end
|
108
|
+
did_enter_region(region)
|
71
109
|
end
|
72
110
|
|
73
111
|
def locationManager(manager, didExitRegion: region)
|
74
112
|
NSLog 'didExitRegion'
|
75
|
-
|
76
|
-
manager.stopRangingBeaconsInRegion(region)
|
77
|
-
if has_event(:exit_region)
|
78
|
-
@events[:exit_region].call(region)
|
79
|
-
end
|
80
|
-
end
|
113
|
+
did_exit_region(region)
|
81
114
|
end
|
82
115
|
|
83
116
|
def locationManager(manager, didRangeBeacons: beacons, inRegion: region)
|
@@ -105,6 +138,11 @@ module Tgios
|
|
105
138
|
end
|
106
139
|
|
107
140
|
BeaconFoundKey.post_notification(self, {region: region, beacon: @current_beacon})
|
141
|
+
BeaconsFoundKey.post_notification(self, {region: region, beacon: @current_beacon, beacons_in_range: beacons_in_range, any_beacons: known_beacons + unknown_beacons})
|
142
|
+
end
|
143
|
+
|
144
|
+
def locationManager(manager, rangingBeaconsDidFailForRegion: region, withError: error)
|
145
|
+
@events[:ranging_failed].call(region, error) if @events[:range_failed]
|
108
146
|
end
|
109
147
|
|
110
148
|
def location_manager
|
@@ -159,22 +197,67 @@ module Tgios
|
|
159
197
|
stop_monitor unless @background
|
160
198
|
end
|
161
199
|
|
200
|
+
def did_enter_region(region)
|
201
|
+
if region.isKindOfClass(CLBeaconRegion)
|
202
|
+
location_manager.startRangingBeaconsInRegion(region)
|
203
|
+
if has_event(:enter_region)
|
204
|
+
@events[:enter_region].call(region)
|
205
|
+
end
|
206
|
+
EnterRegionKey.post_notification(self, {region: region})
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def did_exit_region(region)
|
211
|
+
if region.isKindOfClass(CLBeaconRegion)
|
212
|
+
location_manager.stopRangingBeaconsInRegion(region)
|
213
|
+
if has_event(:exit_region)
|
214
|
+
@events[:exit_region].call(region)
|
215
|
+
end
|
216
|
+
ExitRegionKey.post_notification(self, {region: region})
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
162
220
|
def has_event(event)
|
163
221
|
@events.has_key?(event)
|
164
222
|
end
|
165
223
|
|
166
224
|
def push_beacon(beacon)
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
225
|
+
case @algorithm
|
226
|
+
when :continue
|
227
|
+
if beacon_eqs(beacon, @current_beacon)
|
228
|
+
@current_beacon = beacon
|
229
|
+
else
|
230
|
+
if @previous_beacons.find { |b| !beacon_eqs(beacon, b) }.blank? # all previous beacons is the new beacon
|
231
|
+
@current_beacon = beacon
|
232
|
+
else
|
233
|
+
@current_beacon = nil if @previous_beacons.find{ |b| beacon_eqs(@current_beacon, b)}.blank? # all previous beacons is not the current beacon
|
234
|
+
end
|
235
|
+
end
|
236
|
+
@previous_beacons << beacon
|
237
|
+
@previous_beacons.delete_at(0) if @previous_beacons.length > @tolerance
|
238
|
+
|
239
|
+
when :timeout
|
240
|
+
time_now = Time.now
|
241
|
+
beacon_hash = {beacon: beacon, time: time_now}
|
242
|
+
@beacons_last_seen_at[self.class.beacon_key(beacon)] = beacon_hash
|
243
|
+
|
244
|
+
while @previous_beacons.present? && time_now - @previous_beacons.first[:time] > @tolerance do
|
245
|
+
@previous_beacons.delete_at(0)
|
246
|
+
end
|
247
|
+
@previous_beacons << beacon_hash
|
248
|
+
|
249
|
+
current_beacon_hash = @beacons_last_seen_at[self.class.beacon_key(@current_beacon)]
|
250
|
+
if current_beacon_hash
|
251
|
+
|
252
|
+
end
|
253
|
+
if !current_beacon_hash || time_now - current_beacon_hash[:time] < @tolerance
|
254
|
+
# current beacon not change
|
255
|
+
else
|
256
|
+
count_hash = @previous_beacons.each_with_object(Hash.new(0)) {|e, h| h[self.class.beacon_key(e[:beacon])] += @tolerance - (time_now - e[:time])} # beacon has more weighting if time is later
|
257
|
+
max_beacon_key = count_hash.max_by(&:last).first
|
258
|
+
@current_beacon = @beacons_last_seen_at[max_beacon_key][:beacon]
|
259
|
+
end
|
175
260
|
end
|
176
|
-
@previous_beacons << beacon
|
177
|
-
@previous_beacons.delete_at(0) if @previous_beacons.length > @tolerance
|
178
261
|
end
|
179
262
|
|
180
263
|
def beacon_eqs(beacon1, beacon2)
|
@@ -186,6 +269,10 @@ module Tgios
|
|
186
269
|
beacon1.minor == beacon2.minor && beacon1.major == beacon2.major && beacon1.proximityUUID == beacon2.proximityUUID
|
187
270
|
end
|
188
271
|
|
272
|
+
def self.beacon_key(beacon)
|
273
|
+
[beacon.try(:proximityUUIDbeacon), beacon.try(:major), beacon.try(:minor)].join('/')
|
274
|
+
end
|
275
|
+
|
189
276
|
def new_fake_beacon(options)
|
190
277
|
FakeBeacon.new({uuid: @uuid}.merge(options))
|
191
278
|
end
|
data/lib/tgios/image_loader.rb
CHANGED
@@ -1,20 +1,17 @@
|
|
1
1
|
module Tgios
|
2
2
|
class PhotoController < ExtendedUIViewController
|
3
|
-
include LoadingIndicator
|
4
3
|
attr_accessor :url
|
5
4
|
|
6
5
|
def viewDidLoad
|
7
6
|
super
|
8
7
|
self.view.backgroundColor = :black.uicolor
|
9
8
|
|
10
|
-
|
9
|
+
@load_view = LoadingView.add_loading_view_to(self.view)
|
11
10
|
unless @url.nil?
|
12
|
-
start_loading
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
if success
|
17
|
-
ap 'image loaded'
|
11
|
+
@load_view.start_loading
|
12
|
+
ImageLoader.load_url(@url) do |image, success|
|
13
|
+
@load_view.stop_loading
|
14
|
+
if success && self.view
|
18
15
|
# TODO: use motion layout or other way to handle frame size (or allow full screen)
|
19
16
|
small_frame = self.view.bounds
|
20
17
|
small_frame.size.height -= 20 + 44 if small_frame == UIScreen.mainScreen.bounds
|
@@ -22,9 +19,7 @@ module Tgios
|
|
22
19
|
scroll_view = PhotoScrollView.alloc.initWithFrame(small_frame, image: image)
|
23
20
|
self.view.addSubview(scroll_view)
|
24
21
|
end
|
25
|
-
image_loader.prepareForRelease
|
26
22
|
end
|
27
|
-
image_loader.load
|
28
23
|
|
29
24
|
end
|
30
25
|
end
|
@@ -7,14 +7,38 @@ module Tgios
|
|
7
7
|
self.view.backgroundColor = :dark_gray.uicolor
|
8
8
|
@load_view = Tgios::LoadingView.add_loading_view_to(self.view)
|
9
9
|
@load_view.start_loading
|
10
|
-
if
|
10
|
+
if NSProcessInfo.processInfo.environment[:IPHONE_SIMULATOR_DEVICE].present?
|
11
11
|
self.performSelector('fake_scan', withObject: nil, afterDelay: 3)
|
12
12
|
else
|
13
|
-
|
13
|
+
check_permission
|
14
|
+
# self.performSelector('startScanning', withObject: nil, afterDelay: 0.5)
|
14
15
|
end
|
15
16
|
|
16
17
|
end
|
17
18
|
|
19
|
+
def check_permission
|
20
|
+
status = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
|
21
|
+
if status == AVAuthorizationStatusAuthorized
|
22
|
+
self.performSelector('startScanning', withObject: nil, afterDelay: 0.5)
|
23
|
+
elsif status == AVAuthorizationStatusNotDetermined
|
24
|
+
Dispatch::Queue.new('ScanQrController').async do
|
25
|
+
AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: ->(granted) {
|
26
|
+
if granted
|
27
|
+
Dispatch::Queue.main.async do
|
28
|
+
startScanning
|
29
|
+
end
|
30
|
+
else
|
31
|
+
Dispatch::Queue.main.async do
|
32
|
+
@events[:permission_denied].call if @events[:permission_denied]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
})
|
36
|
+
end
|
37
|
+
else
|
38
|
+
@events[:permission_denied].call if @events[:permission_denied]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
18
42
|
def startScanning
|
19
43
|
@load_view.stop_loading
|
20
44
|
setupCapture
|
@@ -27,6 +51,16 @@ module Tgios
|
|
27
51
|
@session.sessionPreset = AVCaptureSessionPresetHigh
|
28
52
|
|
29
53
|
@device = AVCaptureDevice.defaultDeviceWithMediaType AVMediaTypeVideo
|
54
|
+
if @device.lockForConfiguration(nil)
|
55
|
+
if @device.isFocusModeSupported(AVCaptureFocusModeContinuousAutoFocus)
|
56
|
+
@device.focusMode = AVCaptureFocusModeContinuousAutoFocus
|
57
|
+
end
|
58
|
+
if @device.isAutoFocusRangeRestrictionSupported
|
59
|
+
@device.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear
|
60
|
+
end
|
61
|
+
@device.unlockForConfiguration
|
62
|
+
end
|
63
|
+
|
30
64
|
@error = Pointer.new('@')
|
31
65
|
@input = AVCaptureDeviceInput.deviceInputWithDevice @device, error: @error
|
32
66
|
|
@@ -35,7 +35,7 @@ module Tgios
|
|
35
35
|
@search_bar.sizeToFit
|
36
36
|
@search_bar.delegate=self
|
37
37
|
@search_result_table.tableHeaderView=@search_bar
|
38
|
-
@search_bar.becomeFirstResponder unless @hide_keyboard
|
38
|
+
@search_bar.performSelector('becomeFirstResponder', withObject: nil, afterDelay: 0.0) unless @hide_keyboard
|
39
39
|
@events[:after_layout].call(@search_bar, @search_result_table) unless @events[:after_layout].nil?
|
40
40
|
|
41
41
|
end
|
@@ -64,6 +64,16 @@ module Tgios
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
def viewWillAppear(animated)
|
68
|
+
super
|
69
|
+
@search_result_table_binding.listen_to_keyboard
|
70
|
+
end
|
71
|
+
|
72
|
+
def viewWillDisappear(animated)
|
73
|
+
@search_result_table_binding.stop_listen_to_keyboard
|
74
|
+
super
|
75
|
+
end
|
76
|
+
|
67
77
|
def init
|
68
78
|
super
|
69
79
|
@events={}
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module Tgios
|
2
2
|
class TableSectionListBinding < BindingBase
|
3
|
-
Events = [:cell_identifier, :build_cell, :update_cell,
|
3
|
+
Events = [:cell_identifier, :build_cell, :update_cell, :update_accessory,
|
4
4
|
:get_section, :get_section_text, :get_section_footer_text, :get_rows, :get_row, :get_row_text, :get_row_detail_text,
|
5
|
-
:touch_row, :
|
5
|
+
:touch_row, :delete_row, :can_delete_row, :should_indent, :editing_style,
|
6
|
+
:cell_height, :section_header, :section_footer, :reach_bottom, :header_height, :footer_height
|
6
7
|
]
|
7
8
|
|
8
9
|
def initialize(table_view, list, options={})
|
@@ -137,6 +138,26 @@ module Tgios
|
|
137
138
|
end
|
138
139
|
end
|
139
140
|
|
141
|
+
def tableView(tableView, commitEditingStyle: editingStyle, forRowAtIndexPath: index_path)
|
142
|
+
if editingStyle == UITableViewCellEditingStyleDelete
|
143
|
+
if @events[:delete_row].present?
|
144
|
+
record = @events[:get_row].call(index_path)
|
145
|
+
@events[:delete_row].call(index_path, record) do |success|
|
146
|
+
tableView.deleteRowsAtIndexPaths([index_path], withRowAnimation: UITableViewRowAnimationFade) if success
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def tableView(tableView, canEditRowAtIndexPath:index_path)
|
153
|
+
if @events[:can_delete_row].present?
|
154
|
+
record = @events[:get_row].call(index_path)
|
155
|
+
@events[:can_delete_row].call(index_path, record)
|
156
|
+
else
|
157
|
+
@events[:delete_row].present?
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
140
161
|
def tableView(tableView, numberOfRowsInSection: section)
|
141
162
|
rows = @events[:get_rows].call(section)
|
142
163
|
rows.length
|
@@ -196,6 +217,23 @@ module Tgios
|
|
196
217
|
0
|
197
218
|
end
|
198
219
|
|
220
|
+
def tableView(tableView, shouldIndentWhileEditingRowAtIndexPath:index_path)
|
221
|
+
flag = if @events.has_key?(:should_indent)
|
222
|
+
record = @events[:get_row].call(index_path)
|
223
|
+
@events[:should_indent].call(index_path, record)
|
224
|
+
end
|
225
|
+
return flag unless flag.nil?
|
226
|
+
true
|
227
|
+
end
|
228
|
+
|
229
|
+
def tableView(tableView, editingStyleForRowAtIndexPath:index_path)
|
230
|
+
style = if @events.has_key?(:editing_style)
|
231
|
+
record = @events[:get_row].call(index_path)
|
232
|
+
@events[:editing_style].call(index_path, record)
|
233
|
+
end
|
234
|
+
return style unless style.nil?
|
235
|
+
UITableViewCellEditingStyleDelete
|
236
|
+
end
|
199
237
|
|
200
238
|
def tableView(tableView, willDisplayCell:cell, forRowAtIndexPath:index_path)
|
201
239
|
unless @events[:reach_bottom].nil? || index_path.section < @list.length - 1 || index_path.row < @events[:get_rows].call(index_path).length - 1
|
@@ -43,6 +43,18 @@ module Tgios
|
|
43
43
|
@events[:item_tapped].call(view_at(indexPath), indexPath.row) unless @events[:item_tapped].nil?
|
44
44
|
end
|
45
45
|
|
46
|
+
def collectionView(collectionView, layout:collectionViewLayout, sizeForItemAtIndexPath:indexPath)
|
47
|
+
size = if @events[:item_size].nil?
|
48
|
+
view_at(indexPath).try(:bounds).try(:size)
|
49
|
+
else
|
50
|
+
@events[:item_size].call(view_at(indexPath), indexPath)
|
51
|
+
end
|
52
|
+
unless size && size != CGSizeZero
|
53
|
+
size = collectionViewLayout.itemSize
|
54
|
+
end
|
55
|
+
size
|
56
|
+
end
|
57
|
+
|
46
58
|
def scrollViewDidEndDecelerating(scrollView)
|
47
59
|
page = (scrollView.contentOffset.x / scrollView.frame.size.width).round
|
48
60
|
if page != @current_page
|
@@ -12,6 +12,11 @@ module Tgios
|
|
12
12
|
@tableView.delegate=self
|
13
13
|
@display_field=display_field
|
14
14
|
set_list(list)
|
15
|
+
if @table_utility_binding.nil?
|
16
|
+
@table_utility_binding = UITableViewUtilityBinding.new.bind(@tableView)
|
17
|
+
else
|
18
|
+
@table_utility_binding.bind(@tableView)
|
19
|
+
end
|
15
20
|
@options=(options || {})
|
16
21
|
return self
|
17
22
|
end
|
@@ -44,7 +49,8 @@ module Tgios
|
|
44
49
|
end
|
45
50
|
|
46
51
|
def update_cell_text(record, cell, index_path)
|
47
|
-
|
52
|
+
text = record.is_a?(Hash) ? record[@display_field] : record.send(@display_field)
|
53
|
+
cell.textLabel.text=text.to_s
|
48
54
|
cell
|
49
55
|
end
|
50
56
|
|
@@ -85,21 +91,23 @@ module Tgios
|
|
85
91
|
end
|
86
92
|
|
87
93
|
def tableView(tableView, willDisplayCell:cell, forRowAtIndexPath:indexPath)
|
88
|
-
|
89
|
-
@
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
94
|
+
if indexPath.row >= @list.length - 1
|
95
|
+
unless @events[:load_more].nil? || !@total.nil? && @total <= @list.size || @loading
|
96
|
+
@loading = true
|
97
|
+
@events[:load_more].call(@page+1, indexPath) do |success, results, total|
|
98
|
+
if success && !@list.nil?
|
99
|
+
@total = total
|
100
|
+
@page += 1
|
101
|
+
@list.concat(results)
|
102
|
+
@tableView.reloadData
|
103
|
+
end
|
104
|
+
@loading = false
|
96
105
|
end
|
97
|
-
@loading = false
|
98
106
|
end
|
99
|
-
end
|
100
107
|
|
101
|
-
|
102
|
-
|
108
|
+
unless @events[:reach_bottom].nil?
|
109
|
+
@events[:reach_bottom].call(indexPath)
|
110
|
+
end
|
103
111
|
end
|
104
112
|
end
|
105
113
|
|
@@ -129,7 +137,24 @@ module Tgios
|
|
129
137
|
can_edit
|
130
138
|
end
|
131
139
|
|
140
|
+
def scrollViewDidScroll(scroll_view)
|
141
|
+
@events[:did_scroll].call(scroll_view) if @events[:did_scroll]
|
142
|
+
end
|
143
|
+
|
144
|
+
def scrollViewDidEndDragging(scroll_view, willDecelerate:decelerate)
|
145
|
+
@events[:did_end_scroll].call(scroll_view, decelerate) if @events[:did_end_scroll]
|
146
|
+
end
|
147
|
+
|
148
|
+
def listen_to_keyboard
|
149
|
+
@table_utility_binding.listen_to_keyboard
|
150
|
+
end
|
151
|
+
|
152
|
+
def stop_listen_to_keyboard
|
153
|
+
@table_utility_binding.stop_listen_to_keyboard
|
154
|
+
end
|
155
|
+
|
132
156
|
def onPrepareForRelease
|
157
|
+
@table_utility_binding.prepareForRelease
|
133
158
|
@events=nil
|
134
159
|
@list=nil
|
135
160
|
@display_field=nil
|
data/lib/tgios/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tgios
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.38
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- April Tsang
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sugarcube
|