如何以编程方式将图像对齐到屏幕底部?

问题描述:

我想在屏幕的最下方水平放置一个图像(不管它是模拟器还是iPhone4,iPhone5等)。基本上我只需要将其设置为screen_height - image_height。如何以编程方式将图像对齐到屏幕底部?

UIImage *img = [UIImage imageNamed:@"my-image.png"]; 
    UIImageView *imgView = [[UIImageView alloc]initWithImage:img]; 
    imgView.frame = CGRectMake(0, 0, img.size.width/2, img.size.height/2); 

    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

    CGRect frame = imgView.frame; 
    frame.origin.x = 0; 
    frame.origin.y = screenSize.height - img.size.height; 
    imgView.frame = frame; 

    [self.view addSubview:imgView]; 

我在做什么错? 0,0是屏幕的左上角,所以我不明白为什么screen_height - image_height在这里是错误的...?

+0

你的'self.view'覆盖整个屏幕? 'frame'中的值与* superview *相关,而不是屏幕。 – Mar0ux

确保在计算视图控制器视图的框架时正确计算-viewWillAppear中的位置指标。在-viewDidLoad框架对应于从NIB加载的度量标准,并且如果您的XIB配置为3,5英寸显示器,则视图将在4英寸显示器(iPhone 5)上更高。

代替使用屏幕高度的,使用上海华视图高度:

self.view.frame.size.height 

作为子视图被放置在它的父帧,在屏幕的不是框架的条款。

您也有一个逻辑错误,因为您将图像视图帧高度设置为img.size.height/2,然后使用img.size.height来设置y坐标。

+0

谢谢@Wain +1,解决了我的问题:=) – PeterK

+0

嗯..看来这个视图认为它注定要在iphone4上。它将图像完美地放置在模拟器中,但在我的iphone5上,图像比它应该高出约200px。 – patrick

+0

这是一个不同的问题,涉及到自动调整大小。如果self.view位于视图控制器和顶层,那么视图控制器应该为你做。如果不是,那么您应该将其框架设置为您要添加到视图的边界,然后再将其设置为子视图。并将autoresizingMask设置为灵活的宽度和高度。 – Wain

将子视图对准屏幕底部然后使用自动调整大小的掩码来确保底部边距保持为0。即使超级视图的帧发生变化,这也会使子视图保持其超级视图的底部对齐。

例如

UIImage *img = [UIImage imageNamed:@"my-image.png"]; 
UIImageView *imgView = [[UIImageView alloc]initWithImage:img]; 
imgView.frame = CGRectMake(0, 0, img.size.width, img.size.height); 
CGRect frame = imgView.frame; 
frame.origin.x = 0; 
frame.origin.y = self.view.frame.size.height - img.size.height; 
imgView.frame = frame; 
imgView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin; 

如果你真的想迫使它在屏幕的底部:

CGRect screenBounds = [UIScreen mainScreen].bounds; 
CGRect viewFrameOnScreen = [[view superview] convertRect:view.frame toView:nil]; 
viewFrameOnScreen.origin.y = screenBounds.size.height - viewFrameOnScreen.size.height; 
view.frame = [[view superview] convertRect:viewFrameOnScreen fromView:nil]; 

但我怀疑你要无条件地迫使它在屏幕的底部,即使有一个标签栏或那里的东西。除了在特殊情况下,意见不应超出其父视图的界限。如果你只是想要它在父视图的底部,那么

view.frame.origin.y = [view superview].bounds.size.height - view.frame.size.height;