展开 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 布局以填满屏幕的主要内容,如果未能解决你的问题,请参考以下文章
使用自动布局强制 UITableView 中的 UIView 填满屏幕
具有自动布局的 UITableView 在横向模式下不会填满屏幕。为啥?