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控件,比如UIButtonUILabel

无论是否分配框架,它们的高度都是 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);返回是; // 它打印窗口 === 您在使用 Storyboard 吗?你在为 FMTestViewController 使用 Xib 或 Storyboard 吗?这个问题与FMTestViewController 有关,它的高度是48。 未使用。一个简单的控制器,无需添加任何代码。

以上是关于Xcode11 - UIButton 等控件高度为 48,仅在 XR/XSMAX 设备中的 AppDelegate 中的主要内容,如果未能解决你的问题,请参考以下文章

IOS-OC-基本控件之UIButton

IOS开发之XCode学习003:UIButton基础

添加 UIButton 目标时“类名没有成员函数名”

iOS:禁用时的 UIButton 标题颜色

获取自定义控件的固有高度

UIButton.titleLabel.frame.size 始终为零值