将子视图安装到它的父级?
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的子视图移动到它的父节点之外