移动一个UIView

问题描述:

我试图以编程方式使用下面的方法来移动一个UIView:移动一个UIView

-(void)animatePlaybackLine: (int) currentBeat{ 
    CGRect newFrame = CGRectMake(currentBeat*eighthNoteWidth, 0, eighthNoteWidth, 320); 
    [playbackLine setFrame:newFrame]; 
    NSLog(@"Line animated to %i", currentBeat); 
    NSLog(@"New frame origin %f", playbackLine.frame.origin.x); 
} 

当方法被调用时,NSLogs显示变量currentBeat的递增,因为它应该和playbackLine的框架(我的UIView)似乎正在移动,因为它应该。但是,屏幕上的对象不会移动。我也尝试设置界限和中心而不是框架,并且他们都有类似的结果。我也尝试使用动画而不是设置框架,无济于事。

有什么我应该做的,使屏幕上的图像显示变化的框架?

+0

你肯定'playbackLine'不是'nil'当这个函数被调用?你是在'NSTimer'回调中还是以其他方式调用'animatePlaybackLine:'? – warrenm 2012-08-01 16:54:44

+0

感谢您的回应 - playbackLine绝对不是零。 animatePlaybackLine:在另一个使用NSTimer的类中的while循环中被调用。这是否回答你的问题? – user1467778 2012-08-01 17:27:18

我猜你正在循环中调用该方法?在您的代码执行完毕之前,iOS不会重新绘制屏幕。你不能像这样循环并看到迭代结果。

要为视图添加动画效果,您应该使用UIKit为您提供的本机支持。特别是,请查看the Animations section in the UIView class reference

+0

我怀疑这可能是重画屏幕的问题。我尝试过使用动画:[UIView animateWithDuration:1动画:^ {playbackLine.frame = newFrame;}];但它给了我相同的结果。有没有办法告诉viewController重绘? – user1467778 2012-08-01 17:14:45

+0

如果您使用的是正常动画方法,则不必告诉视图控制器重绘。你已经拿出了循环,对吧?你不需要计时器,循环或类似的东西。本地动画支持为您处理这一切。手动操作是错误的。 – Jim 2012-08-01 18:27:37

+0

我最初担心使用动画的原因是因为我需要将视觉效果与音频播放精确同步,但似乎唯一的方法就是使用动画,所以我只会这样做。谢谢你的帮助。 – user1467778 2012-08-01 18:30:25

试试这个

[UIView animateWithDuration:0.3 
         delay:0.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        datePickerView.frame = imageFrame; 
       } 
       completion:^(BOOL finished){ 
        self.datePickerViewFlag = NO; 
       }]; 
+0

这给了我相同的结果--UIView认为它的框架正在改变,但它不会在显示中移动。 – user1467778 2012-08-01 17:18:14