我有一个有问题的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];
有什么想法吗?我做错了什么?
答案 0 :(得分:0)
将patchSubViewPadding的方法调用移出viewDidAppear并移至viewDidLoad的底部。