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

时间:2013-06-01 18:32:59

标签: iphone ios

我试图将图像水平放置在屏幕的最底部(无论是模拟器,还是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在这里错了......?

4 个答案:

答案 0 :(得分:2)

使用superview视图高度:

,而不是使用屏幕高度
self.view.frame.size.height

由于子视图是根据超视图框架而不是屏幕框架放置的。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

对齐屏幕底部的子视图,然后使用自动调整遮罩以确保底部边距保持恒定为0.这将使子视图在其超视图的底部保持对齐,即使超视图的帧发生更改。

e.g。

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;

答案 3 :(得分:0)

如果你真的,真的想强迫它到屏幕的底部:

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;