Xcode11 - UIButton 等控件高度为 48,仅在 XR/XSMAX 设备中的 AppDelegate 中
Posted
技术标签:
【中文标题】Xcode11 - UIButton 等控件高度为 48,仅在 XR/XSMAX 设备中的 AppDelegate 中【英文标题】:Xcode11 - controls like UIButton height is 48, in AppDelegate only in XR/XSMAX device 【发布时间】:2019-08-21 03:55:50 【问题描述】:单独在ios13中,对于iPhone XR/XS/XSMax或者在模拟器中,在委托方法didFinishLaunchingWithOptions
中我创建了一个任意的UI控件,比如UIButton
,UILabel
。
无论是否分配框架,它们的高度都是 48。令人惊奇的问题。
我的 Xcode 是 Xcode11,beta5
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
UILabel *lab = [UILabel new];
UIButton *btn = [UIButton new];
NSLog(@"btn.height = %f", btn.frame.size.height); // At this point the print is already 48
btn.frame = CGRectMake(100, 100, 200, 100); // The print is still 48
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 200, 300, 0)];
self.window.frame = CGRectMake(0, 100, 100, 100);
FMTestViewController *vc = [FMTestViewController new];
vc.view.frame = CGRectMake(0, 0, 600, 600);
self.window.rootViewController = vc;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
// btn.frame = CGRectMake(0, 100, 100, 100);
[[UIApplication sharedApplication].keyWindow addSubview:btn];
NSLog(@"self.window=%@", self.window);
return YES;
【问题讨论】:
您是否尝试在 设置按钮的框架之后打印按钮的高度? 【参考方案1】:首先,你的方法是错误的。
让我向您解释一下视图层次结构。
界面窗口
---> UIViewController
-------> UIView
------------> UIControls(UIButton、UILabel、UITextField 等)
iOS 应用程序视图层次结构遵循上述模式。
-
窗口(UIWindow): 将其视为绘图的画布。应用程序上显示的所有内容都驻留在此画布中。这是所有子视图和控件中最顶层的父级。
所以你不能直接将 UIControls 添加到 UIWindow。您需要可以容纳和安排这些控件的东西。
-
UIViewController: 所以 UIViewController 出现了。这是所有控件(UIViews)的容器。它负责管理所有的 UIControls。这是您的兴趣点。您可以在该类中添加所有控件。通过编程或使用情节提要。我更喜欢使用 Storyboard。
我注意到的另一件事是您正在使用代码分配FMTestViewController
框架,这是错误的,不需要将框架分配给视图控制器。框架本身已经针对所有设备进行了调整。你应该在 Storyboard 中创建视图控制器。
从here开始的最佳方式。
【讨论】:
是的,但我写这段代码只是为了澄清我的问题——height = 48,我知道当然应该是:``` self.window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds]; FMTestViewController *vc = [FMTestViewController 新]; self.window.rootViewController = vc; [self.window makeKeyAndVisible];返回是; ``` 嗯,这是测试版。可能有一些修复。但是如果您知道视图是如何创建的,为什么不尝试在 ViewController 中创建控件。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption // 应用程序启动后自定义的覆盖点。 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; FMTestViewController *vc = [FMTestViewController 新]; self.window.rootViewController = vc; [self.window makeKeyAndVisible]; NSLog(@"self.window=%@", self.window);返回是; // 它打印窗口 ===FMTestViewController
有关,它的高度是48。
未使用。一个简单的控制器,无需添加任何代码。以上是关于Xcode11 - UIButton 等控件高度为 48,仅在 XR/XSMAX 设备中的 AppDelegate 中的主要内容,如果未能解决你的问题,请参考以下文章