展开 xib 布局以填满屏幕

Posted

技术标签:

【中文标题】展开 xib 布局以填满屏幕【英文标题】:Expand xib layout to fill screen 【发布时间】:2017-01-13 13:01:52 【问题描述】:

我正在将旧 ios 应用程序中的一些代码+xib 布局合并到当前应用程序中。

除了 iPhone 5/6 上的布局外,所有功能都可以正常工作。原始应用程序确实会扩展以适应这些屏幕。但是,我只使用旧应用程序中的一部分视图控制器,从当前应用程序中的新按钮启动。

我看到的是 iPhone 4 尺寸布局占据了屏幕的左上角,例如iPhone 6,加载旧代码中的视图控制器时。

我尝试了很多不同的方法。略有不同的一件事是查看旧应用的 SplashScreen 的代码:

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView 

    //Init the View
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIView *view = [[UIView alloc] initWithFrame:appFrame];
    view.autoresizingMask = UIViewAutoresizingFlexibleHeight |UIViewAutoresizingFlexibleWidth;
    self.view = view;
    [view release];

    NSString *splashImageName = nil;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        splashImageName = @"iPadDefault2.png";
    else
        splashImageName = @"Default.png";

    mSplashImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:splashImageName]];
    [self.view addSubview:mSplashImageView];


所以我在HomeScreenViewController 中添加了以下内容,这是从新应用程序启动的视图:

- (void)loadView
   
    [[[NSBundle mainBundle] loadNibNamed:@"HomeScreenViewController" owner:self options:nil] objectAtIndex:0];
    self.view.autoresizesSubviews = YES;
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

    UIImage* backgroundImage = [UIImage imageNamed:@"Default-no-logo.png"];
    self.view.backgroundColor = [UIColor colorWithPatternImage:backgroundImage];

    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

    [self.view setFrame:appFrame];

现在我将背景图像平铺以填充 iPhone 6 上的空间,但是界面仍然在左上角的相同位置和大小。

我查看了诸如 UIView added programmatically full screen wrong size 之类的答案,创建了一个自定义 UIView,但它似乎对我的情况没有帮助。

编辑:

如果我将loadView 方法更改为:

NSString *splashImageName = nil;

splashImageName = @"Default-no-logo.png";

mSplashImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:splashImageName]];

mSplashImageView.contentMode = UIViewContentModeScaleAspectFit;

[mSplashImageView setFrame:appFrame];

[self.view addSubview:mSplashImageView];

我让图像全屏显示。但是,使用自定义 UIView 执行此操作不起作用。如何让 UIView 尊重 autoresizingMask 并随着更大的显示而增长?

我在不同的地方设置了调试点,对于 iPhone 6,它总是说高度是 667。

【问题讨论】:

检查您从 xib 文件创建的 outlet 基本上是插座问题,请删除并创建插座的新实例 【参考方案1】:

这不应该是答案,所以我不会这样标记它,但这是我想出的在这种情况下确实有效的解决方法(我花了将近 2 天时间尝试了许多不同的方法)。

基本上,我使用 AffineTransform 来放大视图以填充屏幕,同时保持其纵横比。

AspectFillViewController.h:

#import <UIKit/UIKit.h>
@interface AspectFillViewController : UIViewController
@end

#import "AspectFillViewController.h"
@interface AspectFillViewController ()
@end

AspectFillViewController.m:

@implementation AspectFillViewController

- (void)viewDidLoad 

    [super viewDidLoad];
    // Do any additional setup after loading the view.

    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

    self.view.frame = appFrame;

    // Default size: 320 x 460 - this is the size of the xib layout
    int defaultWidth = 320;
    int defaultHeight = 460;

    // Hacky resizing code
    if (appFrame.size.width > defaultWidth || appFrame.size.height > defaultHeight)
    
        CGFloat scaleX = appFrame.size.width / defaultWidth;
        CGFloat scaleY = appFrame.size.height / defaultHeight;
        CGFloat scale = scaleY > scaleX ? scaleX : scaleY;
        self.view.transform = CGAffineTransformMakeScale(scale, scale);

        // This does not work (hence not an ideal solution)
        self.view.center = CGPointMake(appFrame.size.width/2, appFrame.size.height/2); 

     

【讨论】:

以上是关于展开 xib 布局以填满屏幕的主要内容,如果未能解决你的问题,请参考以下文章

调整 ImageView 的大小以使整个布局填满屏幕

使用自动布局强制 UITableView 中的 UIView 填满屏幕

线性布局不会填满整个屏幕

具有自动布局的 UITableView 在横向模式下不会填满屏幕。为啥?

如何让div填满整个屏幕(Masonry / Pinterest)布局

android布局如何实现显示填满整个手机屏幕,EditText如何设置能使其样式不随输入内容太多而发生变化。