似乎有一个问题试图将我的观点绘制到上下文中。 我的基本设置是,我有一个视图控制器,拥有一个UIPageViewController ,其中我加载控制器的视图,可以由用户的手指绘制。 基本上我有一本书可以画出来。 当书中的页面被打开时,我通过调用来保存图像 – (UIImage *)wholeImage { // Render the layer into an image and return UIGraphicsBeginImageContext(self.bounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *wholePageImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return wholePageImage; } 这个返回值然后被保存到一个文件。 但是,当我调用这个保存方法,然后行 [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 被击中,这似乎打电话给我的drawRect:方法,这是覆盖如下, – (void)drawRect:(CGRect)rect { // Draw the current state of the image [self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)]; CGPoint midPoint1 = [self midPointOfPoint1:previousPoint1 point2:previousPoint2]; CGPoint […]
由于我们正在以programmatically进行讨论,因此乐器不在考虑之列。 提前列出一些参考资料: 计算iphone应用程序的fps(每秒帧数) iOS屏幕上显示FPS(无仪器) iOS界面以什么帧率运行animation? 1.使用CADisplayLink 根据文件, 持续时间属性提供了帧之间的时间量。 您可以在您的应用程序中使用此值来计算显示的帧速率… 所以在我的演示项目中,我将一个displayLink添加到mainRunLoop for UITrackingRunLoopMode: self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(screenDidUpdated)]; [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode]; 并使用duration来计算FPS。 但是出于我的预期, duration总是0.016667(〜FPS 60),不pipetableView是否顺利滚动。 我如何使tableView滞后是添加一行- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath : NSData *data = [NSData dataWithContentsOfURL:url]; 然后我转向displayLink.timestamp ,它工作。 2.观察drawRect: 我的第二个想法是观察drawRect:我认为当tableView滚动时,它的drawRect:将被逐帧调用,然后我可以根据drawRect: callings之间的时间差来计算FPS。 但它失败了,导致drawRect:只被调用一次(而单元格多次)。 这种方法类似于Using CADisplayLink ,但也许我select了错误的位置/方法(如drawRect: Using CADisplayLink来观察,我推荐的方法是观察? 问题: 仪器如何精确测量FPS? 文件是using duration to calculate FPS错误的吗? […]
我有一个UITableViewCell子类,它在drawRect:方法中绘制。 整个矩形是自定义绘制的,包括背景。 我能够在保持滚动非常平滑的同时获得非常复杂的单元格。 我的问题:我打电话[table deselectRowAtIndexPath:path animated:YES]; 每当观点出现时,为了遵守苹果的HIG。 但是,没有animation发生。 当我有一个自定义的视图(用子视图创build)时,它是透明的(当然苹果的背景会出现在下面)。 现在不行。 我的drawRect:在“animation时间”中被调用一次,大约一半。 我认为这是因为它将单元格的突出显示的属性从1设置为0,当它降到0.5以下时,它会捕捉到0。 我怎样才能让这个过渡animation? 我的猜测是使用通常的beginAnimations:等等,并将我的单元格对象中的自定义浮点字段从1改为0。这样调用drawRect:重复animation? 更新我设法得到这个几乎工作。 我已经覆盖setSelected:animated:像这样: – (void) setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:NO]; if (animated) { [CATransaction begin]; CATransition* animation = [CATransition animation]; animation.type = kCATransitionFade; animation.duration = 0.6; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [view.layer addAnimation:animation forKey:@"deselectRow"]; [CATransaction commit]; } } 如果桌面视图在屏幕上,这完美地工作。 但是,如果我从导航(返回)返回到表格视图,而不是从选定的淡入淡出,它从不可见到淡入不选。 什么可以导致这个?
我有两个UIViews 。 我的目标是绘制包含这两个UIView的最小的矩形。 我想用我将要摆脱的框架绘制一个矩形 CGRectUnion(view1.frame, view2.frame); 但是当我移动两个UIView的任何一个时,我需要更新大纲矩形的框架。 我以为我可以做到这一点: 1)调整先前绘制的矩形的大小。 (要么) 2)删除先前绘制的矩形并绘制一个新的矩形。 问题是,我不知道如何获得先前绘制的矩形的实例。 所以,我不知道如何更新或删除它.. 你们能帮忙吗? 有没有其他解决scheme来解决这个问题?
有两个drawRect方法: – (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); // do drawing here CGContextRestoreGState(context); } 和 – (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context); // do drawing here UIGraphicsPopContext(); } UIGraphicsPushContext / UIGraphicsPopContext来自UIKit,而CGContextSaveGState / CGContextRestoreGState来自CoreGraphics 。 问题 :这些方法有什么区别? 哪一个更好用? 是否有一些比其他方法更好的certificate方法,反之亦然?
用下面的代码,我成功地遮住了我的绘图的一部分,但这是我想要的蒙版的反面。 这掩盖了绘图的内部部分,我想掩盖外部。 有没有简单的方法来颠倒这个面具? 下面的myPath是一个UIBezierPath 。 CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; CGMutablePathRef maskPath = CGPathCreateMutable(); CGPathAddPath(maskPath, nil, myPath.CGPath); [maskLayer setPath:maskPath]; CGPathRelease(maskPath); self.layer.mask = maskLayer;