将子视图适合它的父级?

时间:2014-10-19 20:20:20

标签: ios objective-c iphone uiview subview

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

我在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 个答案:

答案 0 :(得分:0)

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