Iphone 如何在不失真的情况下逐渐减小图像帧的宽度?

Iphone 如何在不失真的情况下逐渐减小图像帧的宽度?,iphone,objective-c,cocoa-touch,uiimage,Iphone,Objective C,Cocoa Touch,Uiimage,我认为这是一个非常基本的问题,但我正在努力解决这个问题 我有一个截图(一个UIImage),我把它放在一个UIView中(在下面的示例中称为screenShotView)。我想通过逐渐揭示这个截屏视图背后的内容来摆脱这个截屏视图。现在我的截屏视图向左挤压,但我希望它的帧越来越小,直到不再看到截屏视图(不挤压) 这是我的密码。如果我使用UITextView(而不是UIImage)进行相同的转换,它将完全按照我希望的方式工作(无需转换) 也许我不明白图像的概念 [UIView beginAnima

我认为这是一个非常基本的问题,但我正在努力解决这个问题

我有一个截图(一个UIImage),我把它放在一个UIView中(在下面的示例中称为screenShotView)。我想通过逐渐揭示这个截屏视图背后的内容来摆脱这个截屏视图。现在我的截屏视图向左挤压,但我希望它的帧越来越小,直到不再看到截屏视图(不挤压)

这是我的密码。如果我使用UITextView(而不是UIImage)进行相同的转换,它将完全按照我希望的方式工作(无需转换)

也许我不明白图像的概念

 [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:10];

    [screenShotView setFrame:CGRectMake(0, 0, 0, 480)];

[UIView commitAnimations];

这就是动画中间的样子:

<> P>这就是我希望它在动画中间的样子:


这是根据Codo的建议更新的代码(见下文),结果是我不再有动画了。按下按钮后,蓝色屏幕就会弹出。我猜我在添加子视图时出错了——问题似乎是没有添加子视图,因此不能消失:

    -(IBAction)showNextText
{


    screenShotView = [[UIImageView alloc] initWithImage:[self screenshot]];

    [screenShotView setFrame:CGRectMake(0, 0, 320, 480)];
    [screenShotScrollView setFrame:CGRectMake(0, 0, 320, 480)];

    [self.view addSubview:screenShotScrollView];
    [screenShotScrollView addSubview:screenShotView];
    screenShotScrollView.scrollEnabled = NO;


    [self setUpNextText];
    [self removeOldText];

}

-(void)setUpNextText
{
    NSString* secondText = @"This is the second text shown if the user clicks next.";
    textView.text = secondText;
    textView.textColor = [UIColor redColor];
    textView.backgroundColor = [UIColor blueColor];
}

-(IBAction)removeOldText{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:5];

    [screenShotScrollView setFrame:CGRectMake(0,0,320,480)];

    [UIView commitAnimations];

}

不要设置
帧的动画
,而是设置
中心的动画
。请参阅文档

另外,如果您只需要iOS 4兼容性,请使用
-animateWithDuration:animations:

[UIView animateWithDuration:10
                 animations:^{ screenShotView.center = CGPointMake(x, y) } ];

不要设置
帧的动画
,而是设置
中心的动画
。请参阅文档

另外,如果您只需要iOS 4兼容性,请使用
-animateWithDuration:animations:

[UIView animateWithDuration:10
                 animations:^{ screenShotView.center = CGPointMake(x, y) } ];

我不确定我是否完全理解你希望你的观点如何消失

如果希望变得越来越透明,请使用以下代码(而不是setFrame):

如果它应该变得越来越小(但保持其中心),那么尝试:

[screenShotView setFrame:CGRectMake(screenShotView.frame.x, screenShotView.frame,y, 0, 0)];

我不确定我是否完全理解你希望你的观点如何消失

如果希望变得越来越透明,请使用以下代码(而不是setFrame):

如果它应该变得越来越小(但保持其中心),那么尝试:

[screenShotView setFrame:CGRectMake(screenShotView.frame.x, screenShotView.frame,y, 0, 0)];

问题的答案

其实很简单:我制作了一个示例应用程序,让《星球大战》(这里简称为《星球大战》)的过渡运行起来。为了简单起见,我将这两个视图称为firstView和secondView。第一视图显示(将是您的屏幕截图),第二视图将从左侧滑入。我在每个视图上都放置了一个按钮来设置过渡动画,它是wirde to
doTransition
。重要的部分是设置滑入视图的属性
clipsToBounds=YES
autoresizesSubviews=NO
。就这样。我会发布一些截图

- (void)viewDidLoad 
{
    [super viewDidLoad];
    secondView.frame = CGRectMake(0, 0, 0, 480);
    secondView.clipsToBounds = YES;
    secondView.autoresizesSubviews = NO;

    [self.view addSubview:firstView];   
    [self.view addSubview:secondView];  
}

- (IBAction)doTransition
{
    [UIView animateWithDuration:1.0 
                     animations:^{
                         self.secondView.frame = CGRectMake(0, 
                                                            0, 
                                                            320, 
                                                            480);
                     }];
}

页面卷曲研究

我对翻页/卷曲效果做了一些研究。这主要都存在于iOS中,不费吹灰之力就可以创建iBook翻页效果,但它访问的是私有方法和类。我仍然鼓励任何人去看看它,因为它可能有一天会被打开

  • -Steven Troughton Smith的演示应用程序

  • -一款由Tom Brow定制的卷曲页面应用程序,经过试用、编译,看起来很不错

  • -关于Tom Brow的Leaves应用程序的文章,该应用程序由作者Ole Begemann分支()

  • -使用MacOS演示应用程序,非常专业和先进,尽管不是一个仍然鼓舞人心的快速拍摄选项。下载应用程序

  • -数学方法


    • 问题的答案

      其实很简单:我制作了一个示例应用程序,让《星球大战》(这里简称为《星球大战》)的过渡运行起来。为了简单起见,我将这两个视图称为firstView和secondView。第一视图显示(将是您的屏幕截图),第二视图将从左侧滑入。我在每个视图上都放置了一个按钮来设置过渡动画,它是wirde to
      doTransition
      。重要的部分是设置滑入视图的属性
      clipsToBounds=YES
      autoresizesSubviews=NO
      。就这样。我会发布一些截图

      - (void)viewDidLoad 
      {
          [super viewDidLoad];
          secondView.frame = CGRectMake(0, 0, 0, 480);
          secondView.clipsToBounds = YES;
          secondView.autoresizesSubviews = NO;
      
          [self.view addSubview:firstView];   
          [self.view addSubview:secondView];  
      }
      
      - (IBAction)doTransition
      {
          [UIView animateWithDuration:1.0 
                           animations:^{
                               self.secondView.frame = CGRectMake(0, 
                                                                  0, 
                                                                  320, 
                                                                  480);
                           }];
      }
      

      页面卷曲研究

      我对翻页/卷曲效果做了一些研究。这主要都存在于iOS中,不费吹灰之力就可以创建iBook翻页效果,但它访问的是私有方法和类。我仍然鼓励任何人去看看它,因为它可能有一天会被打开

      • -Steven Troughton Smith的演示应用程序

      • -一款由Tom Brow定制的卷曲页面应用程序,经过试用、编译,看起来很不错

      • -关于Tom Brow的Leaves应用程序的文章,该应用程序由作者Ole Begemann分支()

      • -使用MacOS演示应用程序,非常专业和先进,尽管不是一个仍然鼓舞人心的快速拍摄选项。下载应用程序

      • -数学方法


      我想你必须把你的上视图放到一个UIScroll视图中。然后将内容大小设置为与UIScrollView的大小相同,并禁用滚动

      接下来,在UIScrollView上执行原始动画(setFrame)


      基本上,然后使用UIScrollView为内部视图引入单独的坐标系。当外部视图(滚动视图)变小时,它不会扭曲内部视图,而是将其剪裁。

      我想您必须将上部视图放在UIScroll视图中。然后将内容大小设置为与UIScrollView的大小相同,并禁用滚动

      CGRect fillRect = self.view.bounds;
      
      leftImageView.clipsToBounds = YES;
      leftImageView.contentMode = UIViewContentModeTopLeft;
      leftImageView.frame = fillRect;
      
      rightImageView.clipsToBounds = YES;
      rightImageView.contentMode = UIViewContentModeTopRight;
      rightImageView.frame = CGRectMake(fillRect.size.width, 0, 0, fillRect.size.height);
      
      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDuration:3];
      
      leftImageView.frame = CGRectMake(0, 0, 0, fillRect.size.height);
      rightImageView.frame = fillRect;
      
      [UIView commitAnimations];
      
      接下来,在UIScrollView上执行原始动画(setFrame)


      基本上,然后使用UIScrollView为内部视图引入单独的坐标系。当外部视图(滚动视图)变小时,它不会扭曲内部视图,而是将其剪裁。

      非常感谢,但我该如何做到这一点<代码>[screenShotView设置中心:CGRectMa
      CGRect fillRect = self.view.bounds;
      
      leftImageView.clipsToBounds = YES;
      leftImageView.contentMode = UIViewContentModeTopLeft;
      leftImageView.frame = fillRect;
      
      rightImageView.clipsToBounds = YES;
      rightImageView.contentMode = UIViewContentModeTopRight;
      rightImageView.frame = CGRectMake(fillRect.size.width, 0, 0, fillRect.size.height);
      
      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDuration:3];
      
      leftImageView.frame = CGRectMake(0, 0, 0, fillRect.size.height);
      rightImageView.frame = fillRect;
      
      [UIView commitAnimations];