Objective-C:如何编写连续的一系列事件

时间:2011-04-23 09:48:54

标签: iphone objective-c cocoa-touch screenshot

Objective-C让我有点疯狂。我知道它不是一种能够一个接一个地处理每个命令的语言,但如果我需要这样做呢?

例如,我的问题是我想:

  1. 截取当前iPhone屏幕的截图
  2. 在将此屏幕截图添加到我的屏幕之前,我想添加另一个视图
  3. 然后添加屏幕截图,以便其他视图为HIDDEN BENEATH
  4. 然后有一个动画,将屏幕截图滑出视图并显示什么是HIDDEN BENEATH
  5. 现在,应用程序将截取方法中添加的所有视图的屏幕截图(完全忽略我的事件顺序),并且不会隐藏添加的视图BENEATH我的屏幕截图。无论我尝试做什么,一切都会立即发生,这很糟糕。

    这是我的代码:

    - (void)takeScreenShot
    {
        screenShotView = [[UIImageView alloc] initWithImage:[self screenshot]];
        [screenShotView setFrame:CGRectMake(0, -20, 320, 480)];
    
        accessoryView.hidden = YES;
        [self.view addSubview:accessoryView]; // which is hidden beneath and about to be revealed
        [self.view addSubview:screenShotView];
    
        [self.view bringSubviewToFront:screenShotView];
    
        [self startAnimation];
    }
    
    - (void)startAnimation
    {
        [UIView animateWithDuration:0.0
                              delay:0
                            options:UIViewAnimationOptionCurveEaseIn
                         animations:^{
    
                             accessoryView.hidden = NO;
    
                         }
                         completion:^(BOOL finished){
                             [UIView animateWithDuration:3.0
                                                   delay:0
                                                 options:UIViewAnimationOptionCurveLinear
                                              animations:^{
                                                  screenShotView.transform = CGAffineTransformMakeTranslation(-320, 0);   
                                              }
                                              completion:^(BOOL finished){                                        
                                              }
                              ];    
                         }];
    }
    
    
    
    - (UIImage*)screenshot 
    {
        // Create a graphics context with the target size
        // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
        // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
        CGSize imageSize = [[UIScreen mainScreen] bounds].size;
        if (NULL != UIGraphicsBeginImageContextWithOptions)
            UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
        else
            UIGraphicsBeginImageContext(imageSize);
    
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        // Iterate over every window from back to front
        for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
        {
            if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
            {
                // -renderInContext: renders in the coordinate space of the layer,
                // so we must first apply the layer's geometry to the graphics context
                CGContextSaveGState(context);
                // Center the context around the window's anchor point
                CGContextTranslateCTM(context, [window center].x, [window center].y);
                // Apply the window's transform about the anchor point
                CGContextConcatCTM(context, [window transform]);
                // Offset by the portion of the bounds left of and above the anchor point
                CGContextTranslateCTM(context,
                                      -[window bounds].size.width * [[window layer] anchorPoint].x,
                                      -[window bounds].size.height * [[window layer] anchorPoint].y);
    
                // Render the layer hierarchy to the current context
                [[window layer] renderInContext:context];
    
                // Restore the context
                CGContextRestoreGState(context);
            }
        }
    
        // Retrieve the screenshot image
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
        UIGraphicsEndImageContext();
    
        return image;
    }
    

1 个答案:

答案 0 :(得分:1)

这不是真正的答案,但评论没有提供足够的空间。

我刚刚重新创建了一个简单的项目,看看添加视图的顺序是否与截图有任何区别。

我使用了基于视图的应用程序模板。笔尖有两个按钮,连接到属性btn1和btn2。请参见屏幕截图1.上方按钮btn1连接到一个动作,开始拍摄屏幕截图并将其添加到按钮下方以查看差异。第二个按钮最初是隐藏的。

截屏1

enter image description here

这是我的viewController代码。 myView是您的附件视图,将在viewWillAppear上创建。此视图包含一个标签,稍后您将看到。

标题

...

@interface ScreenshotviewsViewController : UIViewController 
{
    UIButton *btn1;
    UIButton *btn2;

    UIView *myView;
}

@property (nonatomic ,retain) IBOutlet UIButton *btn1;
@property (nonatomic ,retain) IBOutlet UIButton *btn2;
@property (nonatomic ,retain) UIView *myView;

- (IBAction)doTheThings;

@end

我会跳过你的截图方法:没有任何改变,就像一个魅力:)。结果屏幕截图2

  • 截屏
  • show btn2
  • 将myView添加为子视图
  • 将截屏添加为子视图

如您所见,屏幕截图未显示其他视图。我只是将它添加到按钮下方以查看差异。

实施:案例1

- (void)viewWillAppear:(BOOL)animated
{
    self.myView = [[[UIView alloc] initWithFrame:CGRectMake(0, 20, 320, 50)] autorelease];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 200, 40)];
    myView.backgroundColor = [UIColor greenColor];
    [myView addSubview:label];

    label.text = @"fooo";

    [label release];
}

- (IBAction)doTheThings
{
    UIImageView *screenShotView = [[UIImageView alloc] initWithImage:[self screenshot]];
    [screenShotView setFrame:CGRectMake(0, 230, 320, 480)];

    btn2.hidden = NO;

    [self.view addSubview:myView];
    [self.view addSubview:screenShotView];
    [screenShotView release];
}

截屏2

enter image description here

案例二将是

  • show btn2
  • 将myView添加为子视图
  • 截屏
  • 将截屏添加为子视图

    • (IBAction为)doTheThings { btn2.hidden = NO; [self.view addSubview:myView];

      UIImageView * screenShotView = [[UIImageView alloc] initWithImage:[self screenshot]]; [screenShotView setFrame:CGRectMake(0,230,320,480)];

      [self.view addSubview:screenShotView]; [screenShotView发布]; }

截屏3

enter image description here

如您所见,订单已被识别。我已经省略了动画。删除动画,看看是否有效。否则像我一样在一个单独的项目中尝试这个,看看它是否孤立地工作。如果是的话,我们将不得不深入了解你的应用程序。