From e0d6932f42274fe7fc3cb761145122df1d32803a Mon Sep 17 00:00:00 2001 From: Sergey Kuleshov Date: Fri, 19 Apr 2013 16:49:55 +0300 Subject: [PATCH] =?UTF-8?q?*=20Added=20ability=20to=20set=20options=20for?= =?UTF-8?q?=20layouts.=20NSLayoutFormatDirectionLeadingToTrailing=20is=20d?= =?UTF-8?q?efault=20(as=20per=20cocoa)=20*=20Mske=20DSL=20more=20flexible?= =?UTF-8?q?=20=E2=80=94=20subviews=20can=20accepts=20array=20of=20symbols?= =?UTF-8?q?=20which=20are=20methods=20or=20instance=20variables=20in=20the?= =?UTF-8?q?=20delegate=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/motion-layout/layout.rb | 39 ++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/lib/motion-layout/layout.rb b/lib/motion-layout/layout.rb index cf27dec..dfa1c8d 100644 --- a/lib/motion-layout/layout.rb +++ b/lib/motion-layout/layout.rb @@ -1,6 +1,7 @@ module Motion class Layout - def initialize(&block) + def initialize(delegate = nil, &block) + @delegate = delegate @verticals = [] @horizontals = [] @metrics = {} @@ -13,20 +14,36 @@ def metrics(metrics) @metrics = metrics end - def subviews(subviews) - @subviews = subviews + def subviews(*subviews) + if subviews[0].is_a? Hash + @subviews = subviews.subviews[0] + elsif (subviews[0].is_a?(String) || subviews[0].is_a?(Symbol)) and @delegate + @subviews = {} + subviews.each do |v| + if @delegate.respond_to?(v) + @subviews[v.to_s] = self.send(v) + elsif @delegate.instance_variable_defined? "@#{v}" + @subviews[v.to_s] = @delegate.instance_variable_get "@#{v}" + else + raise "Couldn't find method or instance variable '#{v}' on the delegate" + end + end + else + raise "subviews only accepts a hash or an array (if delegate is defined)" + end + end def view(view) @view = view end - def horizontal(horizontal) - @horizontals << horizontal + def horizontal(horizontal, options = NSLayoutFormatDirectionLeadingToTrailing) + @horizontals << [horizontal, options] end - def vertical(vertical) - @verticals << vertical + def vertical(vertical, options = NSLayoutFormatDirectionLeadingToTrailing) + @verticals << [vertical, options] end private @@ -38,11 +55,11 @@ def strain end constraints = [] - constraints += @verticals.map do |vertical| - NSLayoutConstraint.constraintsWithVisualFormat("V:#{vertical}", options:NSLayoutFormatAlignAllCenterX, metrics:@metrics, views:@subviews) + constraints += @verticals.map do |vertical, options| + NSLayoutConstraint.constraintsWithVisualFormat("V:#{vertical}", options:options, metrics:@metrics, views:@subviews) end - constraints += @horizontals.map do |horizontal| - NSLayoutConstraint.constraintsWithVisualFormat("H:#{horizontal}", options:NSLayoutFormatAlignAllCenterY, metrics:@metrics, views:@subviews) + constraints += @horizontals.map do |horizontal, options| + NSLayoutConstraint.constraintsWithVisualFormat("H:#{horizontal}", options:options, metrics:@metrics, views:@subviews) end @view.addConstraints(constraints.flatten)