2012-06-19 2 views
1

Я новичок в Core Animation и новичок в RubyMotion (с января 2011 года работает с Obj-C в Xcode). Мне нужно иметь AppLabel (png для него указан в файле AppAppearance.rb, но вся анимация для его загрузки находится в этом файле). Прямо сейчас я использую animateWithDuration, но мне нужно немного отскок влево, когда ярлык загружается. Любая возможная помощь в этом была бы оценена по достоинству, я весь день крутился по кругу. Я пытаюсь использовать код из этого: bounce an image in to view и все, что я могу найти на CAKeyFrameAnimation, но я зацикливаюсь на преобразовании Obj-C в Ruby. Благодаря!Использование CAKeyFrameAnimation (или что-то еще?), Чтобы сделать откат изображения с RubyMotion

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) && [email protected]) 

     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 

ответ

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