我有一个名为PinView的UIView的子类,它包含一个图像。基本上PinView被多次添加到我的应用程序,然后我对PinView对象执行转换。问题是,当我添加很多PinView时,我的应用程序变慢,因为我正在转换每个PinView。将对象添加到多个视图
理想情况下,我想有一个“静态” PinView是被添加到一个UIView多次,但我只需要一次改变它。目前这似乎并不奏效。每次我将静态PinView添加到我的UIView中时,它只会出现在UIView中一次(由于它只能够有一个我猜测的超级视图)。
我很难找到解决这个问题的最佳途径 - 我如何使用一个PinView的单个指针,多次添加到一个UIView,并能够在PinView上执行变换在我的UIView中显示的PinViews? (顺便说一下,所有PinView的变换总是相同的)。
林假定这将是获得的性能提升的最佳途径,如果不是请让我知道的情况。
UPDATE:
- (void)layoutSubviews
{
CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue);
NSMutableArray *mut = nil;
PinView *pinView = nil;
CallOutView *callOut = nil;
//get all dictionary entries
for(NSString *identifier in self.annotationsDict.allKeys){
//get the array from dictionary
mut = [(NSArray *)([self.annotationsDict objectForKey:identifier]) mutableCopy];
//change layout if not nil
if([[mut objectAtIndex:PIN] isKindOfClass:[PinView class]]){
pinView = ((PinView *)[mut objectAtIndex:PIN]);
pinView.transform = transform;
[mut replaceObjectAtIndex:PIN withObject:pinView];
}
if([[mut objectAtIndex:CALL_OUT] isKindOfClass:[CallOutView class]]){
callOut = ((CallOutView *)[mut objectAtIndex:CALL_OUT]);
callOut.transform = transform;
[mut replaceObjectAtIndex:CALL_OUT withObject:callOut];
if(pinView !=nil)callOut.center = CGPointMake(pinView.center.x, pinView.center.y - pinView.frame.size.height);
}
[self updateAnnotationsKey:identifier forObject:[NSArray arrayWithArray:mut]];
mut = nil;
pinView = nil;
callOut = nil;
}
}
UPDATE:
去掉上面的,现在只是有:
- (void)layoutSubviews
{
CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue);
for(UIView *view in self.subviews){
view.transform = transform;
}
}
我不认为子类化和静态变量的工作方式,你认为他们这样做。如果您对多个视图有相同的转换,那么它们将全部位于屏幕上的相同位置(即使您可以多次添加相同的视图,但不能这样做)。如果他们在不同的地方,他们需要成为不同的对象。 – 2012-02-05 15:35:04
另一种选择是在drawRect:或类似的内部自己绘制图像。 – 2012-02-05 15:48:27
应用转换不可能是瓶颈。它实际上是渲染需要时间的转换视图。我可能是错的,如果你的变换非常复杂,试着只生成一次变换,并将其设置为一个静态的CSTransform3D或CGAffineTransform变量,但是我认为,我怀疑它的速度很慢。您可以随时在您的问题中添加一些代码示例以获得更具体的帮助。 – 2012-02-05 15:48:48