将子视图安装到它的父级?

Posted

技术标签:

【中文标题】将子视图安装到它的父级?【英文标题】:Fitting subview to it's parent? 【发布时间】:2014-10-19 20:20:19 【问题描述】:

我有一个称为 MyListViewController 的有问题的 UIView。它位于我的应用程序的第一个选项卡中。

我在 viewDidLoad 部分添加了一个子视图(在子视图上定义了一些约束)。 当我运行应用程序时,子视图不适合它的根视图。但是,如果我导航到另一个选项卡,然后重新单击到第一个选项卡,应用程序将正确地适合子视图。

我也不能使用 [self.detailView setTranslatesAutoresizingMaskIntoConstraints:YES];因为它会导致大量的约束冲突。

无论如何,我编写了我的自定义方法patchSubViewPadding,以使subView 适合它的rootView,它被定义为detailView。 如上所述,如果我导航到其他选项卡,然后导航到第一个选项卡,应用程序会正确显示子视图

@interface MyListViewController ()

@property (strong, nonatomic) CustomViewController *customViewController;

@end

@implementation MyListViewController

- (void)viewDidLoad 
    [super viewDidLoad];

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    CustomViewController *viewController = (CustomViewController *)[storyboard instantiateViewControllerWithIdentifier:@"customView"];
    self.customViewController = viewController;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        [self.detailView addSubview:self.customViewController.view];


-(void)viewDidAppear:(BOOL)animated

    [CommonUtilities patchSubViewPadding:self.detailView subView:self.customViewController.view padding:0];


-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

    [CommonUtilities patchSubViewPadding:self.detailView subView:self.customViewController.view padding:0];


@end

这是我的自定义方法:

+(CGRect)patchSubViewPadding:(UIView *)superView subView:(UIView *)subView padding:(float)padding

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    
        if (padding == 0)
            padding = -4.0f;

        CGRect frame = superView.bounds;

        frame.origin.y = 0;
        frame.size.width = frame.size.width - padding;
        subView.frame = frame;

        return subView.frame;
    

    return subView.frame;

我在 viewDidLoad 或 viewWillLayoutSubviews 中尝试了以下属性,但没有成功。

[self.detailView setNeedsLayout];
[self.detailView setNeedsUpdateConstraints];

有什么想法吗?我做错了什么?

【问题讨论】:

【参考方案1】:

将 patchSubViewPadding: 的方法调用移出 viewDidAppear 并移到 viewDidLoad 的底部。

【讨论】:

patchSubViewPadding 调用不在 viewWillAppear 中。我还在 viewDidLoad 中尝试了 patchSubViewPadding,但没有任何改变。为什么我必须单击另一个选项卡,然后单击第一个选项卡才能看到已安装的子视图?这很奇怪.. 尝试移动 [CommonUtilities patchSubViewPadding:self.detailView subView:self.customViewController.view padding:0];到 [self.detailView addSubview:self.customViewController.view] 下;在 viewDidLoad

以上是关于将子视图安装到它的父级?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4:防止UIView的子视图移动到它的父节点之外

如何将子视图从其父视图的父视图置于顶部

将子视图控制器链接到情节提要中的父视图控制器

Android Studio:如何防止工具栏中的向上按钮将子视图向右推?

将绑定传递回父级的父级视图

SetEmptyView 不适合他的父级(列表视图)