为什么我的UIView在动画上变形?

时间:2012-09-04 13:20:11

标签: objective-c ios5 animation objective-c-blocks uiswipegesturerecognizer

我正在开发一款iPad应用,它使用滑动手势在日历上的月份之间移动。动画样式很好,应用程序在我的动画之前和之后显示正确的屏幕。但是,在动画期间,存在两个问题:

- 原始视图变形或模糊 - 动画期间,原始月份(9月)显示在“下一页”而不是下个月(10月)。

我有一份工作要抓住这个截图,但是如果你看一下动画镜头的左上角你可以看到问题。看起来所有的文字都变得大胆了。这是图像,后面是代码。

在动画之前:

Before the animation http://i1219.photobucket.com/albums/dd427/Dave_Chambers/1-2.png

动画期间:

During the animation

如果你看左上角的'K-SUPER ...',你可以看到由于动画引起的失真,文字更粗。

动画结束后:

After the animation

任何人都知道我怎么能解决这个问题,所以我看到9月之前,10月在动画期间和10月之后?

代码:

    - (void)swipedInLeftDirection:(UISwipeGestureRecognizer *)sender {
NSLog(@"UserActions: %s", __PRETTY_FUNCTION__);

[MonthlyEventView animateWithDuration:1.0
                 animations:^{
                         [MonthlyEventView setAnimationTransition: UIViewAnimationTransitionCurlUp forView:self cache:NO];
                 }
                 completion:^(BOOL finished) {

                     NSDateComponents* plusOneMonth = [[NSDateComponents alloc] init];
                     [plusOneMonth setMonth:1];
                     NSDate* oneMonthForward = [[NSCalendar currentCalendar] dateByAddingComponents:plusOneMonth toDate:self.selectedDate options:0];
                     [self.delegate monthlyView:self userDidPerformSwipeInDirection:UISwipeGestureRecognizerDirectionLeft andExpectingDateToBeSelected:oneMonthForward];

                 }];

}

对于它的价值,视图大小是704 x 569.也许这很重要,我不知道。

提前感谢任何解决方案。

2 个答案:

答案 0 :(得分:1)

你的文字失真是由于在几乎完全相同的位置绘制标签,几乎是由于动画,创造了一种大胆的效果。最简单的解决方案是简单地让您的日历视图不透明。即为整个视图设置[UIColor lightGrayColor]的背景颜色。这也会使卷曲页面的背面显得灰白色,就像人们期望的灰纸一样。

还有关于旧月出现在动画下面的原因。 UIView转换的机制基本上是捕获视图的当前外观,然后渲染动画后它应该是什么样子,然后在屏幕外设置原始捕获的动画。在所有这些发生之后,完成块被称为。所以基本上你从你所处的状态动画到你所处的状态,然后将日历设置为新的日期。因此可能听起来很奇怪,设置日历的日期是动画的一部分。

此外,还有一个更直接的基于块的API。

[UIView transitionWithView:self // since this code is in the view's implementation.
                  duration:0.8
                   options:UIViewAnimationOptionTransitionCurlUp
                animations:^{
                    NSDateComponents* plusOneMonth = [[NSDateComponents alloc] init];
                    [plusOneMonth setMonth:1];
                    NSDate* oneMonthForward = [[NSCalendar currentCalendar] dateByAddingComponents:plusOneMonth toDate:self.selectedDate options:0];
                    [self.delegate monthlyView:self userDidPerformSwipeInDirection:UISwipeGestureRecognizerDirectionLeft andExpectingDateToBeSelected:oneMonthForward];
                }
                completion:^(BOOL b){
                    // If you need notification when the animation completes put a callback here.
                }];

答案 1 :(得分:0)

用此替换动画代码,然后重试:

[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationTransitionCurlUp animations:^{
    monthlyEventView.center = CGPointMake(<#CGFloat x#>, <#CGFloat y#>);//set center, frame or bounds
} completion:^(BOOL finished) {

    NSDateComponents* plusOneMonth = [[NSDateComponents alloc] init];
    [plusOneMonth setMonth:1];
    NSDate* oneMonthForward = [[NSCalendar currentCalendar] dateByAddingComponents:plusOneMonth toDate:self.selectedDate options:0];
    [self.delegate monthlyView:self userDidPerformSwipeInDirection:UISwipeGestureRecognizerDirectionLeft andExpectingDateToBeSelected:oneMonthForward];
}];