gpt4 book ai didi

ios - 使用 CAKeyFrameAnimation(或其他东西?)使图像与 RubyMotion 反弹

转载 作者:行者123 更新时间:2023-11-29 13:34:06 26 4
gpt4 key购买 nike

我是 Core Animation 的新手,也是 RubyMotion 的新手(自 1 月以来一直在 Xcode 中使用 Obj-C)。我需要 AppLabel(它的 png 在名为 AppAppearance.rb 的文件中指定,但它加载的所有动画都在这个文件中)。现在我正在使用 animateWithDuration 但是当标签加载时我需要向左反弹一点。任何可能的帮助将不胜感激,我整天都在兜圈子。我正在尝试使用以下代码:bounce an image in to view以及我在 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

最佳答案

试试这样的方法,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

关于ios - 使用 CAKeyFrameAnimation(或其他东西?)使图像与 RubyMotion 反弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11094774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com