【问题标题】:iPhone Animation : How to animate only subview ? Not the whole view?iPhone 动画:如何仅对子视图进行动画处理?不是全貌?
【发布时间】:2012-01-01 01:57:10
【问题描述】:

我是动画新手,我正在使用以下代码进行翻转动画。

//MyMapView is UIView

MyMapView *aMapView = [[MyMapView alloc] initWithFrame:CGRectMake(0, 118, 321, 300) AndResArray:self.nearMeArray];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
    [[self view] addSubview:nearMeMap];

    [UIView commitAnimations];

它工作正常。但是整个视图(带有超级视图)会翻转。

我只想翻转 MyMapView 的子视图。超级视图不应该翻转。

怎么做???

已编辑

屏幕:

下面是主屏幕。单击地图按钮时,我只想翻转屏幕的棕色部分。整个屏幕不应该翻转。

谢谢...

【问题讨论】:

  • 您需要将视图粘贴到另一个子视图中。

标签: iphone objective-c uiview core-animation


【解决方案1】:
-(void)viewDidLoad
{
    [super viewDidLoad];

    OptionView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
    OptionView.backgroundColor=[UIColor blueColor];
    OptionIsShow=false;

    MoveView=[[UIView alloc] initWithFrame:CGRectMake(40, 40, 70, 70)];
    [MoveView setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:MoveView];

}

-(void)ViewOrHideOptionView
{

        CGContextRef context = UIGraphicsGetCurrentContext();
        [UIView beginAnimations:nil context:context];

        [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.MoveView cache:NO];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:1.0];

        if(!OptionIsShow)
        {
            [self.MoveView addSubview:OptionView];
            OptionIsShow=true;
        }
        else
        {
            [self.OptionView removeFromSuperview];
            OptionIsShow=false;
        }

        [UIView commitAnimations];
}

【讨论】:

    【解决方案2】:

    我已经弄清楚了问题所在。请看下面的代码。

    地图视图.m

    - (id)initWithFrame:(CGRect)frame {
    
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code.
    
        [self performSelector:@selector(addMapView) withObject:nil afterDelay:2.0];
    
    }
    return self;
    }
    
    - (void) addMapView {
    
    //MyMapView is UIView
    
    MKMapView  *aMapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 321, 300)];
    
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];
    [self addSubview:aMapView];
    
    [UIView commitAnimations];
    
    }
    

    然后只需在您想要的地方添加 MapView 类的对象。如下所示。

    //MyMapView is UIView
    mapView  *aMapView = [[mapView alloc] initWithFrame:CGRectMake(0, 118, 321, 300)];
    [[self view] addSubview:aMapView];
    

    如果此评论对您有帮助,请投票。

    谢谢,

    MinusMaster。

    【讨论】:

    • 很棒的代码,谢谢...。还有一件事,当我为它设置动画时,背景应该被清除。有什么想法吗?
    • 超级视图背景...以及如何用动画 UIViewAnimationTransitionFlipFromLeft 将其移除???
    • 在 MapView 类中创建一个方法并保持相同的代码,但将行 addSubView 更改为 removeFromsuperView。
    【解决方案3】:

    Matteo 的回答部分正确,但您需要在添加之前在视图上设置动画,否则将无法正常工作。像这样:

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
                           forView:aMapView
                             cache:YES];
    [self.view addSubview:aMapView];
    [UIView commitAnimations];
    

    或者,您可以使用 iOS 4 中引入的基于块的 API。这是一个示例。

    [UIView transitionWithView:aMapView
            duration:1.0
            options:UIViewAnimationTransitionFlipFromRight
            animations:^{ [self.view addSubview:aMapView]; }
            completion:^(BOOL f){ }
    ];
    

    【讨论】:

      【解决方案4】:

      像这样的动画转换会为视图的内容设置动画。系统会在动画开始时拍摄内容的快照,在您提交时拍摄另一个快照,然后在它们之间制作动画。正如您在原始代码中看到的那样,整个视图都被动画化了。

      最简单的解决方案可能只是引入一个中间视图,它是地图的大小和位置。然后在向其添加地图时为 那个 视图设置动画。

      查看编程指南部分Creating Animated Transitions Between Views 中的更多信息。尽管您使用的方法在 iOS 4 中已被新的基于块的版本所取代。

      【讨论】:

      • 中间视图就是这样!
      【解决方案5】:

      你需要将你的视图添加到self.view,然后只翻转一个MapView:

      MyMapView *aMapView = [[MyMapView alloc] initWithFrame:CGRectMake(0, 118, 321, 300) AndResArray:self.nearMeArray];
      
      [UIView beginAnimations:nil context:nil];
      [UIView setAnimationDuration:1.0];
      [self.view addSubView:aMapView];
      [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:aMapView cache:YES];
      
      [UIView commitAnimations];
      

      【讨论】:

      • 我之前试过...什么也没有发生...只是显示一个MapView,没有任何动画!!!
      • 我想我也做了同样的事情!
      • aMapView 在没有任何动画的情况下显示!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多