【问题标题】:How can you check when a uiview has appeared on screen/finished drawing?如何检查 uiview 何时出现在屏幕/完成的绘图上?
【发布时间】:2012-03-21 09:36:09
【问题描述】:

我似乎在使用 drawrect 方法时遇到了一些问题。我正在使用 CGContextDrawPDFPage 将 PDF 页面绘制到视图上,然后我希望在加载后在视图的框架上运行 UIView 动画。但是,如果我在 drawrect 方法的末尾调用动画,它会导致动画不流畅,因为动画在 UIView 实际出现在屏幕上之前(有时是 2 秒后)持续到一半。

我正在寻找一种方法来检查视图是否已完成绘制。任何想法或帮助将不胜感激?

这是我的代码...

-(void)drawRect:(CGRect)inRect{  

pageRef = [[PDFManager sharedManager] getLargePDFPageRefForPage:pageNumber];
if(pageRef) {
    ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, 0.0, [self bounds].size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(pageRef, kCGPDFCropBox, [self bounds], 0, true));
    CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);
    CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);

    CGContextDrawPDFPage(ctx, pageRef);    
}

[self moveFrame];

}


-(void)moveFrame{


    [UIView animateWithDuration:0.7 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{

        self.frame = CGRectMake(0, 0, 500, 400);


    } completion:^(BOOL finished) {

    }];
}

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    AFAIK - 每次视图“变脏”时都会调用drawRect: 方法,这可能很常见。我对您的建议是不要在视图类中编写“移动”代码,而是在控制器类中编写,这可能是关注点分离的更好位置(控制器管理视图的位置,而视图管理自身的绘图)。流程将与此类似:

    1. 启动视图并将其添加为子视图(在控制器中)。这将导致视图自行绘制。
    2. 将实际视图移动到您需要的位置(在控制器中)。

    【讨论】:

    • 我知道你来自哪里,但这并不能解决问题,因为“添加子视图”甚至在 uiview 中的 draw rect 方法之前就已完成调用。不过想法不错。
    • 所以在添加子视图时,用[subview setNeedsDisplay:YES]将其标记为脏。这应该会强制调用drawRect: 方法。
    • 问题不在于 drawRect: 没有被立即调用,问题在于完成但需要时间来显示视图。因此,我想知道视图何时呈现在屏幕上。
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多