【问题标题】:Issue with presenting an external UIView in a UIViewController: outlets don't show up在 UIViewController 中显示外部 UIView 的问题:出口不显示
【发布时间】:2016-02-13 00:18:18
【问题描述】:

我有一个 UIViewController,它在情节提要中设置了 UI 元素,并且一切正常。现在我在单独的 xib、.h 和 .m 文件中创建了一个新的 UIView,我将其称为“覆盖”;然后我展示应该覆盖下面所有内容的覆盖层,以便只能看到覆盖层:

// in controller.m
OverlayView *overlayView = [[OverlayView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
overlayView.layer.zPosition = 1000;
[self.view addSubview:overlayView];

覆盖出现在一个奇怪的位置(它的顶部距离导航栏的底部大约 50 像素)。更重要的是,除了叠加层的背景之外,看不到叠加层中的任何元素。它只是一块空白的红色画布。我仔细检查了元素的 alpha 值是否为 1,它们被设置为不隐藏,并且它们也在覆盖的 initWithFrame 中明确设置:

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor redColor]; // red canvas shows up
        self.title.textColor = [UIColor blackColor]; // title can't be seen; why not?
        self.body.textColor = [UIColor blackColor]; // body can't be seen; why not?
    }
    return self;
}

我不直接将叠加层放在控制器的xib中然后简单地更改它的hidden属性的原因是这个叠加层将被多个控制器使用,我想重新使用它,因此把它作为一个单独的视图。

我做错了什么?

【问题讨论】:

    标签: ios objective-c uiview uiviewcontroller viewdidload


    【解决方案1】:

    父视图(视图控制器的视图)负责设置子视图的框架。如果您使用自动布局,您需要使用 setTranslateAutoresizingMaskIntoConstraintsNO 并在代码中添加所需的约束。请记住,在调用viewDidLayoutSubviews 之后将设置孩子的框架。 如果您不使用自动布局,只需使用viewWillAppear 中的setFrame 方法设置框架即可。

    【讨论】:

    • 您好,感谢您的回复,只是想仔细检查一下我是否理解正确:我们在这里谈论一个控制器和两个视图,第一个视图是我在情节提要中设置的控制器自己的视图,第二个view 是我想在控制器自己的视图上呈现的叠加层。那么你在这里说的是哪个子视图?
    • 另外,您是否建议我将[self.view addSubview:overlayView]; 逻辑放在viewWillAppear 中?我已经试过了,结果是一样的。当我调用 initWithFrame 时,框架已经设置好了。
    • 不,应该在viewDidLoad中添加视图。在 viewWillAppear 中,如果您需要并且不使用自动布局,您可以访问或更改框架。如果确实使用自动布局,则应在 viewDidLoad 中添加视图时添加约束,并且不要弄乱框架,并且只能在 viewDidLayoutSubviews 中访问框架。在 viewWillAppear 中,我认为框架尚未设置。同样,是否使用自动布局非常重要。
    【解决方案2】:

    事实证明,我必须从视图自己的 initWithFrame 中加载 nib。

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        id mainView;
        if (self) {
            NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyOverlayView" owner:self options:nil];
            mainView = [subviewArray objectAtIndex:0];
        }
        return mainView;
    }
    
    - (void)awakeFromNib {
        [super awakeFromNib];
    }
    

    上面的代码修复了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多