Objective-C让我有点疯狂。我知道它不是一种能够一个接一个地处理每个命令的语言,但如果我需要这样做呢?
例如,我的问题是我想:
现在,应用程序将截取方法中添加的所有视图的屏幕截图(完全忽略我的事件顺序),并且不会隐藏添加的视图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;
}
答案 0 :(得分:1)
这不是真正的答案,但评论没有提供足够的空间。
我刚刚重新创建了一个简单的项目,看看添加视图的顺序是否与截图有任何区别。
我使用了基于视图的应用程序模板。笔尖有两个按钮,连接到属性btn1和btn2。请参见屏幕截图1.上方按钮btn1连接到一个动作,开始拍摄屏幕截图并将其添加到按钮下方以查看差异。第二个按钮最初是隐藏的。
截屏1
这是我的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
如您所见,屏幕截图未显示其他视图。我只是将它添加到按钮下方以查看差异。
实施:案例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
案例二将是
将截屏添加为子视图
(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
如您所见,订单已被识别。我已经省略了动画。删除动画,看看是否有效。否则像我一样在一个单独的项目中尝试这个,看看它是否孤立地工作。如果是的话,我们将不得不深入了解你的应用程序。