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 に答える