motion-form 0.4.0 → 0.5.0
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.
- checksums.yaml +4 -4
- data/README.md +7 -8
- data/lib/project/cells/base_cell.rb +1 -2
- data/lib/project/cells/button_cell.rb +21 -27
- data/lib/project/cells/text_field_cell.rb +0 -9
- data/lib/project/cells/text_input_cell.rb +42 -15
- data/lib/project/form/base.rb +0 -1
- data/lib/project/motion-form.rb +5 -15
- data/lib/project/rows/base_row.rb +4 -5
- data/lib/project/rows/button_row.rb +1 -7
- metadata +2 -4
- data/lib/project/font_icon_mapper.rb +0 -22
- data/lib/project/views/icon_view.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17fd1f9a5463bdee3649012327557fd1d68eec18
|
4
|
+
data.tar.gz: dd0f05563e9c4d5a51594af6a869474bf1b4086c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5945341d2e0ca7d5cd972a69497c08a410da80d197bbc001404887b36cfd4f407efb05e6106e513e68f4d1675bc7fd43f1160ce3f907b3757e4ee532740d5dd
|
7
|
+
data.tar.gz: 3202f56a063f6b2a8ae965ec8d2e09f1353426e784844908bd5f17c83c622a8799b665eac7ffe403e64a8bed380ca0fb9153e73372b7145df7e9d5cb5b53da12
|
data/README.md
CHANGED
@@ -22,19 +22,19 @@ form = MotionForm.form_for(view) do |form|
|
|
22
22
|
# Ex: form.section do |section|
|
23
23
|
|
24
24
|
form.section 'Profile' do |section|
|
25
|
-
section.input :name,
|
26
|
-
section.input :username,
|
27
|
-
section.input :pinterest,
|
28
|
-
section.input :twitter,
|
29
|
-
section.input :website,
|
25
|
+
section.input :name, label: 'Your name', value: 'David Copperfield'
|
26
|
+
section.input :username, label: 'A username'
|
27
|
+
section.input :pinterest, label: 'Pinterest username'
|
28
|
+
section.input :twitter, label: 'Twitter username'
|
29
|
+
section.input :website, label: 'Personal website'
|
30
30
|
section.text :bio, placeholder: 'Write a short bio...'
|
31
31
|
|
32
32
|
section.button :submit, action: submit
|
33
33
|
end
|
34
34
|
|
35
35
|
form.section 'Account' do |section|
|
36
|
-
section.button :change_email,
|
37
|
-
section.button :change_password,
|
36
|
+
section.button :change_email, action: push_email_controller
|
37
|
+
section.button :change_password, action: push_password_controller
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -118,7 +118,6 @@ end
|
|
118
118
|
|
119
119
|
``` ruby
|
120
120
|
MotionForm.config do |config|
|
121
|
-
config.icon_font = UIFont.fontWithName('dscovr', size: 14.0)
|
122
121
|
config.section_header_color = UIColor.blueColor
|
123
122
|
config.section_header_text_color = UIColor.whiteColor
|
124
123
|
config.button_text_color = UIColor.redColor
|
@@ -9,8 +9,7 @@ class BaseCell < UITableViewCell
|
|
9
9
|
|
10
10
|
def initWithStyle(style, reuseIdentifier: reuse_identifier)
|
11
11
|
super.tap do |cell|
|
12
|
-
cell.selectionStyle
|
13
|
-
cell.contentView.addSubview(text_field)
|
12
|
+
cell.selectionStyle = UITableViewCellSelectionStyleNone
|
14
13
|
cell.selectedBackgroundView = selected_background_view
|
15
14
|
end
|
16
15
|
end
|
@@ -12,25 +12,38 @@ class ButtonCell < TextInputCell
|
|
12
12
|
def initWithStyle(style, reuseIdentifier: reuse_identifier)
|
13
13
|
super.tap do |cell|
|
14
14
|
cell.selectionStyle = UITableViewCellSelectionStyleGray
|
15
|
+
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator
|
15
16
|
cell.text_field.enabled = false
|
16
17
|
|
17
|
-
cell.
|
18
|
+
cell.text_label.textColor = MotionForm.button_text_color
|
19
|
+
|
18
20
|
cell.add_tap_recognizer
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
24
|
+
def setup_constraints
|
25
|
+
text_label.translatesAutoresizingMaskIntoConstraints = false
|
26
|
+
contentView.addSubview(text_label)
|
27
|
+
|
28
|
+
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
|
29
|
+
'H:|-margin-[label]-margin-|',
|
30
|
+
options: NSLayoutFormatAlignAllCenterY,
|
31
|
+
metrics: { 'margin' => 10 },
|
32
|
+
views: subviews_dict))
|
33
|
+
|
34
|
+
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
|
35
|
+
'V:|[label]|',
|
36
|
+
options: 0,
|
37
|
+
metrics: {},
|
38
|
+
views: subviews_dict))
|
39
|
+
end
|
40
|
+
|
22
41
|
def add_tap_recognizer
|
23
42
|
addGestureRecognizer(tap_recognizer)
|
24
43
|
end
|
25
44
|
|
26
45
|
def label=(label)
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def build_highlighted_placeholder(label)
|
31
|
-
NSAttributedString.alloc.initWithString(
|
32
|
-
label,
|
33
|
-
attributes: { NSForegroundColorAttributeName => MotionForm.button_text_color })
|
46
|
+
text_label.text = label
|
34
47
|
end
|
35
48
|
|
36
49
|
def tap_recognizer
|
@@ -41,25 +54,6 @@ class ButtonCell < TextInputCell
|
|
41
54
|
post('FormCellWasTapped', notification_payload)
|
42
55
|
end
|
43
56
|
|
44
|
-
def add_right_view
|
45
|
-
text_field.rightView = right_view
|
46
|
-
text_field.rightViewMode = UITextFieldViewModeAlways
|
47
|
-
end
|
48
|
-
|
49
|
-
def accessory=(icon)
|
50
|
-
right_view.name = icon
|
51
|
-
end
|
52
|
-
|
53
|
-
def right_view
|
54
|
-
@right_view ||= IconView.alloc.init
|
55
|
-
end
|
56
|
-
|
57
|
-
def layoutSubviews
|
58
|
-
super
|
59
|
-
|
60
|
-
right_view.frame = [[size.width - 56, 0], [36, 43]]
|
61
|
-
end
|
62
|
-
|
63
57
|
def notification_payload
|
64
58
|
{ key: key }
|
65
59
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
motion_require './base_cell'
|
2
|
-
motion_require '../views/icon_view'
|
3
2
|
|
4
3
|
class TextFieldCell < BaseCell
|
5
4
|
IDENTIFIER = 'TextFieldCell'
|
@@ -43,10 +42,6 @@ class TextFieldCell < BaseCell
|
|
43
42
|
def secure=(secure)
|
44
43
|
end
|
45
44
|
|
46
|
-
def icon=(icon)
|
47
|
-
left_view.name = icon
|
48
|
-
end
|
49
|
-
|
50
45
|
def text_view
|
51
46
|
@text_view ||= SZTextView.alloc.init.tap do |text_view|
|
52
47
|
text_view.font = UIFont.fontWithName('HelveticaNeue-Light', size: 14.0)
|
@@ -55,10 +50,6 @@ class TextFieldCell < BaseCell
|
|
55
50
|
end
|
56
51
|
alias_method :text_field, :text_view
|
57
52
|
|
58
|
-
def left_view
|
59
|
-
@left_view ||= IconView.alloc.init
|
60
|
-
end
|
61
|
-
|
62
53
|
def value
|
63
54
|
text_view.text
|
64
55
|
end
|
@@ -1,17 +1,48 @@
|
|
1
1
|
motion_require './base_cell'
|
2
|
-
motion_require '../views/icon_view'
|
3
2
|
|
4
3
|
class TextInputCell < BaseCell
|
5
4
|
IDENTIFIER = 'TextInputCell'
|
6
5
|
|
7
6
|
def initWithStyle(style, reuseIdentifier: reuse_identifier)
|
8
7
|
super.tap do |cell|
|
8
|
+
cell.setup_constraints
|
9
|
+
|
9
10
|
cell.observe('ButtonCallbackWillFire', 'resign_textfield:')
|
10
11
|
cell.observe('FormWillValidate', 'resign_textfield:')
|
11
12
|
cell.observe('FormWillRender', 'resign_textfield:')
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
16
|
+
def setup_constraints
|
17
|
+
[text_label, text_field].each do |subview|
|
18
|
+
subview.translatesAutoresizingMaskIntoConstraints = false
|
19
|
+
contentView.addSubview(subview)
|
20
|
+
end
|
21
|
+
|
22
|
+
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
|
23
|
+
'H:|-margin-[label(100@1000)][input]-margin-|',
|
24
|
+
options: NSLayoutFormatAlignAllCenterY,
|
25
|
+
metrics: { 'margin' => 10 },
|
26
|
+
views: subviews_dict))
|
27
|
+
|
28
|
+
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
|
29
|
+
'V:|[label]|',
|
30
|
+
options: 0,
|
31
|
+
metrics: {},
|
32
|
+
views: subviews_dict))
|
33
|
+
|
34
|
+
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
|
35
|
+
'V:|[input]|',
|
36
|
+
options: 0,
|
37
|
+
metrics: {},
|
38
|
+
views: subviews_dict))
|
39
|
+
end
|
40
|
+
|
41
|
+
def subviews_dict
|
42
|
+
{ 'label' => text_label,
|
43
|
+
'input' => text_field }
|
44
|
+
end
|
45
|
+
|
15
46
|
class << self
|
16
47
|
def has_value?
|
17
48
|
true
|
@@ -23,34 +54,35 @@ class TextInputCell < BaseCell
|
|
23
54
|
end
|
24
55
|
|
25
56
|
def label=(label)
|
26
|
-
|
57
|
+
text_label.text = label
|
27
58
|
end
|
28
59
|
|
29
60
|
def secure=(secure)
|
30
61
|
text_field.secureTextEntry = secure
|
31
62
|
end
|
32
63
|
|
33
|
-
def
|
34
|
-
|
64
|
+
def placeholder=(placeholder)
|
65
|
+
text_field.placeholder = placeholder
|
35
66
|
end
|
36
67
|
|
37
68
|
def text_field
|
38
69
|
@text_field ||= UITextField.alloc.init.tap do |field|
|
39
70
|
field.autocorrectionType = UITextAutocorrectionTypeNo
|
40
|
-
field.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
|
41
71
|
field.backgroundColor = UIColor.clearColor
|
42
72
|
field.clearButtonMode = UITextFieldViewModeWhileEditing
|
43
73
|
field.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
|
44
|
-
field.
|
45
|
-
field.
|
46
|
-
field.textColor = UIColor.grayColor
|
74
|
+
field.textColor = UIColor.darkGrayColor
|
75
|
+
field.font = UIFont.fontWithName('HelveticaNeue-Light', size: 16.0)
|
47
76
|
|
48
77
|
field.delegate = self
|
49
78
|
end
|
50
79
|
end
|
51
80
|
|
52
|
-
def
|
53
|
-
@
|
81
|
+
def text_label
|
82
|
+
@text_label ||= UILabel.alloc.init.tap do |label|
|
83
|
+
label.textColor = UIColor.darkGrayColor
|
84
|
+
label.font = UIFont.fontWithName('HelveticaNeue-Light', size: 18.0)
|
85
|
+
end
|
54
86
|
end
|
55
87
|
|
56
88
|
def value
|
@@ -61,11 +93,6 @@ class TextInputCell < BaseCell
|
|
61
93
|
text_field.text = value
|
62
94
|
end
|
63
95
|
|
64
|
-
def layoutSubviews
|
65
|
-
text_field.frame = [[10, 0], [300, 43]]
|
66
|
-
left_view.frame = [[0, 0], [36, 43]]
|
67
|
-
end
|
68
|
-
|
69
96
|
def textFieldDidBeginEditing(text_field)
|
70
97
|
post('FormCellDidBeginEditing', notification_payload)
|
71
98
|
end
|
data/lib/project/form/base.rb
CHANGED
data/lib/project/motion-form.rb
CHANGED
@@ -3,9 +3,7 @@ motion_require './cells/text_field_cell'
|
|
3
3
|
|
4
4
|
module MotionForm
|
5
5
|
class << self
|
6
|
-
attr_writer :
|
7
|
-
:icon_mapper,
|
8
|
-
:section_header_color,
|
6
|
+
attr_writer :section_header_color,
|
9
7
|
:section_header_text_color,
|
10
8
|
:section_header_font,
|
11
9
|
:button_text_color
|
@@ -46,27 +44,19 @@ module MotionForm
|
|
46
44
|
end
|
47
45
|
|
48
46
|
def section_header_font
|
49
|
-
@section_header_font || UIFont.fontWithName('HelveticaNeue
|
50
|
-
end
|
51
|
-
|
52
|
-
def icon_font
|
53
|
-
@icon_font || UIFont.fontWithName('dscovr', size: 14.0)
|
54
|
-
end
|
55
|
-
|
56
|
-
def icon_mapper
|
57
|
-
@icon_mapper || FontIconMapper
|
47
|
+
@section_header_font || UIFont.fontWithName('HelveticaNeue', size: 14.0)
|
58
48
|
end
|
59
49
|
|
60
50
|
def section_header_color
|
61
|
-
@section_header_color || '#
|
51
|
+
@section_header_color || '#EFEFF4'.to_color
|
62
52
|
end
|
63
53
|
|
64
54
|
def section_header_text_color
|
65
|
-
@section_header_text_color || '#
|
55
|
+
@section_header_text_color || '#232323'.to_color
|
66
56
|
end
|
67
57
|
|
68
58
|
def button_text_color
|
69
|
-
@button_text_color || '#
|
59
|
+
@button_text_color || '#232323'.to_color
|
70
60
|
end
|
71
61
|
end
|
72
62
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
class BaseRow
|
2
|
-
attr_reader :
|
2
|
+
attr_reader :key, :label, :options
|
3
3
|
|
4
4
|
def initialize(key, options)
|
5
5
|
@key = key
|
6
6
|
@options = options
|
7
7
|
|
8
|
-
@icon = options.fetch(:icon, nil)
|
9
8
|
@label = options.fetch(:label, key.to_s.titleize)
|
10
9
|
@value = options.fetch(:value, nil)
|
11
10
|
end
|
@@ -35,8 +34,8 @@ class BaseRow
|
|
35
34
|
end
|
36
35
|
|
37
36
|
def update_cell(cell)
|
38
|
-
cell.key
|
39
|
-
cell.label
|
40
|
-
cell.
|
37
|
+
cell.key = key
|
38
|
+
cell.label = label
|
39
|
+
cell.placeholder = options.fetch(:placeholder, nil)
|
41
40
|
end
|
42
41
|
end
|
@@ -2,23 +2,18 @@ motion_require '../cells/button_cell'
|
|
2
2
|
motion_require './text_field_row'
|
3
3
|
|
4
4
|
class ButtonRow < TextInputRow
|
5
|
-
attr_reader :on_tap_callback
|
5
|
+
attr_reader :on_tap_callback
|
6
6
|
|
7
7
|
def initialize(key, options)
|
8
8
|
super
|
9
9
|
|
10
10
|
@on_tap_callback = options.fetch(:action, lambda {})
|
11
|
-
@accessory = options.fetch(:accessory, nil)
|
12
11
|
end
|
13
12
|
|
14
13
|
def cell_type
|
15
14
|
ButtonCell
|
16
15
|
end
|
17
16
|
|
18
|
-
def accessory
|
19
|
-
options.fetch(:accessory, nil)
|
20
|
-
end
|
21
|
-
|
22
17
|
def listen
|
23
18
|
observe('FormCellWasTapped', 'tapped:')
|
24
19
|
end
|
@@ -34,6 +29,5 @@ class ButtonRow < TextInputRow
|
|
34
29
|
def update_cell(cell)
|
35
30
|
super
|
36
31
|
|
37
|
-
cell.accessory = accessory
|
38
32
|
end
|
39
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Devon Blandin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: motion-keyboard-avoiding
|
@@ -108,7 +108,6 @@ files:
|
|
108
108
|
- lib/project/cells/text_field_cell.rb
|
109
109
|
- lib/project/cells/text_input_cell.rb
|
110
110
|
- lib/project/controllers/form_controller.rb
|
111
|
-
- lib/project/font_icon_mapper.rb
|
112
111
|
- lib/project/form/base.rb
|
113
112
|
- lib/project/motion-form.rb
|
114
113
|
- lib/project/rows/base_row.rb
|
@@ -117,7 +116,6 @@ files:
|
|
117
116
|
- lib/project/rows/text_input_row.rb
|
118
117
|
- lib/project/section/section.rb
|
119
118
|
- lib/project/string.rb
|
120
|
-
- lib/project/views/icon_view.rb
|
121
119
|
- lib/project/views/padded_label.rb
|
122
120
|
- lib/project/views/section_header_view.rb
|
123
121
|
homepage: https://github.com/dblandin/motion-form
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module MotionForm
|
2
|
-
module FontIconMapper
|
3
|
-
class << self
|
4
|
-
def call(icon)
|
5
|
-
unicode(icon).hex.chr(Encoding::UTF_8)
|
6
|
-
end
|
7
|
-
|
8
|
-
def unicode(icon)
|
9
|
-
mappings[icon] || ''
|
10
|
-
end
|
11
|
-
|
12
|
-
def mappings
|
13
|
-
@mappings ||= begin
|
14
|
-
path = NSBundle.mainBundle.pathForResource('icons', ofType:'json')
|
15
|
-
data = NSData.dataWithContentsOfFile(path)
|
16
|
-
|
17
|
-
NSJSONSerialization.JSONObjectWithData(data, options: 0, error: nil)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class IconView < UILabel
|
2
|
-
attr_reader :name
|
3
|
-
|
4
|
-
def init
|
5
|
-
super.tap do |view|
|
6
|
-
view.font = MotionForm.icon_font
|
7
|
-
view.backgroundColor = UIColor.clearColor
|
8
|
-
view.textColor = UIColor.grayColor
|
9
|
-
view.textAlignment = NSTextAlignmentCenter
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def name=(name)
|
14
|
-
@name = name
|
15
|
-
|
16
|
-
self.text = MotionForm.icon_mapper.call(name)
|
17
|
-
end
|
18
|
-
end
|