Iphone 堆叠的UIView层不';别动
我正在开发一个iPhone应用程序,它基于加速度计在其他UIView层之间移动UIView层 如果最顶层是基于加速度计移动的那一层,那么没有问题。如果我在上面添加一个UIView,则移动会被严重延迟。如果在其顶部添加第二个UIView,移动将停止 updateInterval是60,我正在使用UIView的drawAtPoint:方法移动层 我的问题:是否存在需要启用的UIView属性,例如不透明、clipsToBounds等,以实现基于加速计的三明治式UIView的精确移动 提前感谢您提供的任何帮助 更新: 底层是不透明的,上层是透明的PNG 访问UIView的frame属性时遇到困难。下面是我的Iphone 堆叠的UIView层不';别动,iphone,cocoa-touch,Iphone,Cocoa Touch,我正在开发一个iPhone应用程序,它基于加速度计在其他UIView层之间移动UIView层 如果最顶层是基于加速度计移动的那一层,那么没有问题。如果我在上面添加一个UIView,则移动会被严重延迟。如果在其顶部添加第二个UIView,移动将停止 updateInterval是60,我正在使用UIView的drawAtPoint:方法移动层 我的问题:是否存在需要启用的UIView属性,例如不透明、clipsToBounds等,以实现基于加速计的三明治式UIView的精确移动 提前感谢您提供的任
Object2D
类中的一些代码:
- (id)initWithImage:(NSString*)imageName
{
if (self = [super init])
{
position = [[Point2D alloc] init];
vector = [[Vector2D alloc] init];
imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
myImageObj = [[UIImage alloc] initWithContentsOfFile:imagePath];
size.width = myImageObj.size.width;
size.height = myImageObj.size.height;
}
return self;
}
- (void)draw
{
[myImageObj drawAtPoint:CGPointMake( position.X, position.Y ) ];
[ self setNeedsDisplay ];
}
下面是从ViewController
类调用的类的原始draw:
方法:
- (id)initWithImage:(NSString*)imageName
{
if (self = [super init])
{
position = [[Point2D alloc] init];
vector = [[Vector2D alloc] init];
imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
myImageObj = [[UIImage alloc] initWithContentsOfFile:imagePath];
size.width = myImageObj.size.width;
size.height = myImageObj.size.height;
}
return self;
}
- (void)draw
{
[myImageObj drawAtPoint:CGPointMake( position.X, position.Y ) ];
[ self setNeedsDisplay ];
}
我尝试了各种方法来访问frame属性,但均无效:
myImageObj.frame = CGRectMake(position.X, position.Y, size.width, size.height);
myImageObj.CGImage.frame.y = position.Y;
查看API文档表明,第一种方法可以工作,但事实并非如此
您知道如何访问UIView的frame属性吗
提前感谢。每次使用drawAtPoint时:都会强制将UIView重新渲染到图形层中。这个很贵 UIView已经有一个定义其位置和大小的-frame属性。仅更新位置允许图形硬件移动已合成的层 我不知道你所说的“三明治”是什么意思,但我假设它将层放置在不同的z索引上?如果是这样的话,我假设中间层(您正在移动的层)和顶层必须是透明的,底层应该是不透明的
如果这不是您想要的,请告诉我…您不能直接设置单个帧参数。您必须创建一个新的CGRect并将帧设置为该CGRect。创建CGRect后,有不同的方法更改其参数
CGRect myNewFrame = someView.frame;
myNewFrame.origin.x = 1.0;
myNewFrame.size = CGSizeMake(100.0f, 50.0f);
someView.frame = myNewFrame;
这样做的目的是按照您的意愿设置CGRect,然后将视图的frame属性设置为该CGRect,这样您就可以了
就UIView而言。。。
你可能有一些问题。首先,如上所述,drawAtPoint方法非常昂贵。其次,可能更糟的是,你有几个透明的图像。透明度是iPhone上最昂贵的操作之一,事实上,有一个仪器测试就是为了这个。你应该不惜一切代价避免透明度。在旋转过程中,一些带有重绘的透明PNG极有可能让你的应用程序打嗝
我的下一个建议是考虑如果你需要透明的中间视图,也许另一层可以完成这项工作。如果需要触摸功能,可以使用图层层次根的视图来处理触摸。换言之,从后面到前面,您有这样一个:UIView 加莱尔 UIView 加莱尔 加莱尔 但你可以这样做: UIView(现在处理所有触摸) 加莱尔 CALayer(以前是视图) 加莱尔 加莱尔 这也会有所帮助,因为Calayer的开销比UIView小
希望这能有所帮助。我认为您误解了UIView的工作原理。首先,您希望创建UIImageView来承载UIImages。然后,您希望使用其addSubview:方法将它们添加到一个superview中。最后,要更改中间UIImageView的frame属性(如果希望平滑设置动画,则在beginAnimations/Committeanimations块中)以使其移动到新位置 如果将UIImage放置在封装的UIImageView中,它将作为纹理缓存在GPU上,UIImageView位置的任何更改都将被硬件加速。drawAtPoint:,正如Dan指出的,非常昂贵,如果可以的话,应该避免使用。myImageObj.frame=CGRectMake代码的使用是正确的,它只需要应用于UIImageView,而不是UIImage 对于简单的三层结构,除非您有大量图像,否则即使是具有大量透明度的图像也会平滑地设置动画。我已经为几十个透明的UIView(它们只是CALayers周围非常轻的包装)完成了这项工作,没有性能问题 另外,如果您的Point2D和Vector2D类只是二维坐标的包装器,那么您可能需要考虑用CGPoint结构替换它们。围绕这种轻量级数据类型有很多支持函数