1

我是 Core Animation 的新手,也是 RubyMotion 的新手(自 1 月以来一直在 Xcode 中使用 Obj-C)。我需要 AppLabel (它的 png 在名为 AppAppearance.rb 的文件中指定,但它加载的所有动画都在此文件中)。现在我正在使用 animateWithDuration 但是当标签加载时我需要向左反弹。任何可能的帮助将不胜感激,我整天都在转圈。我正在尝试使用以下代码:将图像退回以查看以及我可以在 CAKeyFrameAnimation 上找到的任何内容,但我在将 Obj-C 转换为 Ruby 时遇到了困难。谢谢!

class AppLabel < UILabel
#-------------------------


  DefaultHeight =                 45
  DefaultWidth =                  170               


  def initWithFrame( frame )
  #-------------------------

    if ( super( frame ) )


      @showing = false
      @hiding = false


      self.size.width = 170 if self.size.width == 0
      self.size.height = 46 if self.size.height == 0

      self.backgroundColor = AppAppearance.appLabelBackgroundColor
      self.font = AppAppearance.fontWithSize( 14 )
      self.textColor = AppAppearance.appLabelTextColor      

      self.numberOfLines = 2


    end

    self

  end


  #
  # method. drawTextInRect
  # 
  def drawTextInRect( rect )
  #-------------------------


    rect.origin.x += 10
    rect.origin.y += 2    
    rect.size.width -= 30

    super( rect )

  end

  #
  # method. show
  #
  def show
  #-------

    if ( ( self.hidden? || self.alpha < 1 ) && !@showing )

      if self.hidden?

          self.alpha = 0.0
          self.hidden = false

      end

      @showing = true

      UIView.animateWithDuration(
         1.0,
         animations: lambda do
           self.alpha = 1.0
         end,
         completion: lambda do | finished |
           @showing = false
         end
      )          

    end

  end

  #
  # method. hide
  #
  def hide
  #-------

    unless ( self.hidden? || self.alpha == 0 || @hiding )

      log( 'hiding' )

      @hiding = true

      UIView.animateWithDuration(
        1.0,
        animations: lambda do
          self.alpha = 0.0
        end,
        completion: lambda do | finished |
          self.hidden = true
          @hiding = false
        end
      )          

    end

  end

end
4

1 回答 1

1

尝试这样的事情,Procs 可能有点矫枉过正,但它的工作原理!时机远非完美,但我相信你可以做到这一点;)

# view: The view to animate
# attrs:
#   times:    How many times the view should bounce
#   offset:   The distance to the left of the furthest (first) bounce
#   change:   How much to decrement the offset each bounce
#   duration: The duration of the furthest (first) bounce
def bounce(view, attrs={times: 4, offset: 20, change: 5, duration: 0.25})
  # The points to animate the view to
  @points = []

  attrs[:times].times do |n|
    new_x = view.position.x - (attrs[:offset] - n * attrs[:change])
    # Move the point left, then back to the original position
    @points << [new_x, view.position.y]
    @points << view.position
  end

  # An array to hold the blocks containing the animations
  @animations = [];

  # Needs an animation to move away then back
  (attrs[:times] * 2).times do |n|
    new_dur = (Float(attrs[:change]) / Float(attrs[:offset])) * (attrs[:times] * 2 - n) * attrs[:duration]
    # Add a new movement to the animations array
    @animations << Proc.new {
      UIView.animateWithDuration(new_dur,
        delay: 0,
        #Ease out when moving away and in when moving back
        options: (n % 2 == 0 ? UIViewAnimationCurveEaseOut : UIViewAnimationCurveEaseIn),
        animations: lambda {
          # Animate the view to the position at the start of the points array
          view.position = @points.first
        },
        completion: lambda { |completed|
          # Remove the first point and first animation from their corresponding
          # arrays then run the next animation until there are none left
          @animations.shift
          @points.shift
          @animations.first.call if @animations.length != 0
        })
    }
  end
  # Initiate the chain of animations
  @animations.first.call
end
于 2012-09-06T19:11:13.643 回答