Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 堆叠的UIView层不';别动_Iphone_Cocoa Touch - Fatal编程技术网

Iphone 堆叠的UIView层不';别动

Iphone 堆叠的UIView层不';别动,iphone,cocoa-touch,Iphone,Cocoa Touch,我正在开发一个iPhone应用程序,它基于加速度计在其他UIView层之间移动UIView层 如果最顶层是基于加速度计移动的那一层,那么没有问题。如果我在上面添加一个UIView,则移动会被严重延迟。如果在其顶部添加第二个UIView,移动将停止 updateInterval是60,我正在使用UIView的drawAtPoint:方法移动层 我的问题:是否存在需要启用的UIView属性,例如不透明、clipsToBounds等,以实现基于加速计的三明治式UIView的精确移动 提前感谢您提供的任

我正在开发一个iPhone应用程序,它基于加速度计在其他UIView层之间移动UIView层

如果最顶层是基于加速度计移动的那一层,那么没有问题。如果我在上面添加一个UIView,则移动会被严重延迟。如果在其顶部添加第二个UIView,移动将停止

updateInterval是60,我正在使用UIView的drawAtPoint:方法移动层

我的问题:是否存在需要启用的UIView属性,例如不透明、clipsToBounds等,以实现基于加速计的三明治式UIView的精确移动

提前感谢您提供的任何帮助

更新: 底层是不透明的,上层是透明的PNG

访问UIView的frame属性时遇到困难。下面是我的
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结构替换它们。围绕这种轻量级数据类型有很多支持函数