边界和框架:如何显示UIImage的一部分

时间:2010-12-09 20:04:38

标签: iphone objective-c cocoa-touch uikit

我的目标很简单;我想创建一个显示UIImage的程序,当从下到上滑动时,显示另一个UIImage。这里的图像可能是幸福的脸/悲伤的脸。悲伤的面孔应该是起点,幸福的面孔应该是终点。当你的手指滑动时,手指下方的部分应显示出快乐的脸部。

到目前为止,我尝试用我用于快乐脸部图像的UIImageview的框架和边界属性来解决这个问题。

这段代码的作用是错误的,因为转换开始于屏幕的中心而不是底部。请注意,框架和边界的原点都是0,0 ......

我已经阅读了很多关于帧和边界的页面,但我没有得到它。任何帮助表示赞赏!

只有一次调用loadimages。

- (void)loadImages {
    sadface = [UIImage imageNamed:@"face-sad.jpg"];
    happyface = [UIImage imageNamed:@"face-happy.jpg"];
    UIImageView *face1view = [[UIImageView alloc]init];
    face1view.image = sadface;
    [self.view addSubview:face1view];

    CGRect frame;
    CGRect contentRect = self.view.frame;
    frame = CGRectMake(0, 0, contentRect.size.width, contentRect.size.height);
    face1view.frame = frame;
    face2view = [[UIImageView alloc]init];
    face2view.layer.masksToBounds = YES;
    face2view.contentMode = UIViewContentModeScaleAspectFill;
    face2view.image = happyface;
    [self.view addSubview:face2view];
    frame = CGRectMake(startpoint.x, 0, contentRect.size.width, contentRect.size.height);
    face2view.frame = frame;
    face2view.clipsToBounds = YES;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint movepoint = [[touches anyObject] locationInView: self.view];
    NSLog(@"movepoint: %f %f", movepoint.x, movepoint.y);
    face2view.bounds = CGRectMake(0, 0, 320, 480 - movepoint.y);
}

UIImages和UIImageViews在dealloc函数中被妥善处理。

2 个答案:

答案 0 :(得分:2)

事实上,你似乎对框架和边界感到困惑。事实上,它们很容易。永远记住,任何视图都有自己的坐标系。 frame,center和transform属性以superview的坐标表示,而bounds则以视图自己的坐标系表示。如果视图没有超级视图(尚未安装到视图层次结构中),它仍然具有框架。在iOS中,frame属性是根据视图的边界,居中和变换计算的。当没有超视图时,您可能会问到地狱框架和中心是什么意思。将视图添加到另一个视图时使用它们,允许在视图实际可见之前定位视图。

当视图的边界与其框架不同时,最常见的例子是当它不在其超视图的左上角时:它的bounds.origin可能是CGPointZero,而它的frame.origin则不是。另一个经典的例子是UIScrollView,它经常修改它的bounds.origin以使子视图滚动(事实上,修改坐标系的原点会自动移动每个子视图而不影响它们的帧),而它自己的帧是恒定的。

返回您的代码。首先,当您已经在图像视图中显示图像时,使用图像初始化视图是有意义的:

UIImageView *face1view = [[UIImageView alloc] initWithImage: sadface];

这有助于图像视图立即正确调整大小。建议不要使用-init初始化视图,因为这可能会跳过指定初始化程序-initWithFrame:中的一些重要代码。

由于你将face1view添加到self.view,你应该真正使用它的边界而不是它的框架:

face1view.frame = self.view.bounds;

同样适合更幸福的面孔。然后在-touchesMoved:…中,您应该更改face2view的框架以将其移动到self.view中或(如果self.view不包含除脸部之外的任何其他子视图)修改self.view的边界将两个面部移到一起。相反,你做了一些奇怪的事情,比如在face2view中垂直拉伸幸福的脸。如果你想让幸福的面孔从self.view的底部滑动,你应该最初设置它的框架(最初不可见):

face2view.frame = CGRectOffset(face2view.frame, 0, CGRectGetHeight(self.view.bounds));

如果您选择通过更改图像视图的帧来交换面部(与更改self.view的界限相比),我猜您可能想要更改两个视图的帧起源,以便让人感到悲伤脸朝上滑,幸福的脸向上滑。或者,如果你想让幸福的脸覆盖悲伤的脸:

face2view.frame = face1view.frame;

答案 1 :(得分:0)

你的问题似乎与touchesMoved中的face2view.bounds有关。 您将此视图的边界设置为rect,x:0,y:0,width:320,height:480 - y

x = 0 ==在x轴上左侧

y = 0 == y轴顶部

因此,您将此图像框放在左上角,并使其填满整个视图。那不是你想要的。图像只是在此imageView中居中。