如果在动画某些元素时出现问题,UIView会排除其他元素



在我的代码中,当键盘弹出时,我已经正确地将UITextfield移到了视图中。然而,我一直在努力创建另一个动画,只对UIImageView起作用,因为这个当前的解决方案永久地偏移了UIImageView中的徽标。

var logoImage:UIImageView!
var logoImageX:CGFloat = 85
var logoImageY:CGFloat = 35
// Logo Code
let logo:UIImage = UIImage(named:"color-logo.png")
let logoHeight:CGFloat = 150
let logoWidth:CGFloat = logoHeight
logoImage = UIImageView(image:Logo)
logoImage.frame = CGRectMake(logoImageX,logoImageY,logoWidth, logoHeight)
self.view.insertSubview(logoImage, atIndex: 1)
// Keyboard Auto Scroll
func textFieldDidBeginEditing(textField: UITextField!) {
    self.animateTextField(textField, up: true)
    self.animateWithDuration(true)
}
func textFieldDidEndEditing(textField: UITextField!) {
    self.animateTextField(textField, up: false)
    self.animateWithDuration(false)
}
func animateTextField(textField:UITextField,up: Bool){
    let movementDistance:Int = -100
    let movementDuration:NSTimeInterval = 0.25
    var movement = CGFloat(Int((up ? movementDistance : -movementDistance)))
    UIView.beginAnimations("animateTextField", context:nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration)
    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    UIView.commitAnimations()
}

这是UIImageView的函数:

//Logo (UIImageView) Scroll
func animateWithDuration(up:Bool){
    let logoMovementDuration = 0.25
    let logoMovementDistance:Int = 20
    var logoMovement = CGFloat(Int((up ? logoMovementDistance : -logoMovementDistance + (logoImageY))))
    UIView.beginAnimations("animateWithDuration", context:nil)
    UIView.setAnimationDuration(logoMovementDuration)
    logoImage.frame = CGRectMake(logoImageX,logoMovement,logoImage.frame.size.width,logoImage.frame.size.height)
    UIView.commitAnimations()
}

我已经找到了一个解决方案,通过创建多个uiview,或者在我的情况下3具体。

代码看起来像这样,根据你想要实现的,分成不同的组,以便对每个组应用动画(这些是在viewDidLoad()之外声明的,使它们可以公开访问):

var otherView = UIView(frame: UIScreen.mainScreen().bounds)
var logoImageView = UIView(frame:CGRect(x: 0, y: 0, width: xx, height: xx)) 
var resultView = UIView(frame:CGRect(x: 0, y: 0, width: xx, height: xx))

之后,我将子视图添加到UIView实例中,然后最后添加到父视图中(在viewDidLoad()中声明):

self.logoImageView.insertSubview(logoImage, atIndex:1)
self.view.insertSubview(logoImageView, atIndex: 1)

然后最后应用了相同的函数,现在使用基于块的动画,这是rdelmar建议的,也是苹果自iOS 4.0以来推荐的(在viewDidLoad()之外和之后):

//键盘自动滚动

func textFieldDidBeginEditing(textField: UITextField!) {
    self.animateTextField(textField, up: true)
}
func textFieldDidEndEditing(textField: UITextField!) {
    self.animateTextField(textField, up: false)
}
func animateTextField(textField:UITextField,up: Bool){
    let resultMovementDistance:Int = -xx
    let movementDistance:Int = -xx
    let movementDuration:NSTimeInterval = 0.xx
    var resultMovement = CGFloat(Int((up ? resultMovementDistance : -resultMovementDistance)))
    var otherMovement = CGFloat(Int((up ? movementDistance : -movementDistance)))
    var logoMovement = otherMovement/5
    UIView.animateWithDuration(
        movementDuration,
        delay: 0,
        options: UIViewAnimationOptions.CurveEaseIn, animations:{
        self.otherView.frame = CGRectOffset(self.otherView.frame,0,otherMovement)},
        completion:nil)
    UIView.animateWithDuration(
        movementDuration,
        delay: 0,
        options: UIViewAnimationOptions.CurveEaseIn, animations:{
            self.logoImageView.frame = CGRectOffset(self.logoImageView.frame,0,logoMovement)},
        completion:nil)
    UIView.animateWithDuration(
        movementDuration,
        delay: 0,
        options: UIViewAnimationOptions.CurveEaseIn, animations:{
            self.resultView.frame = CGRectOffset(self.resultView.frame,0,resultMovement)},
        completion:nil)
}

注意:我确实在块中嵌套动画时遇到了困难,但我很高兴它成功了。我希望这对你有帮助。

最新更新