使用addSubview添加视图时,会将视图大小调整为其父级

时间:2009-11-17 16:57:52

标签: iphone objective-c cocoa-touch uiview

使用addSubview时遇到问题。

示例代码:

ParentView *myParentView = [[ParentView alloc] initWithNibName:@"ParentView " bundle:nil];
ChildeView *myChildeView = [[ChildeView alloc] initWithNibName:@"ChildeView" bundle:nil];

//...  parent frame resized with setFrame lets say to x:0, y:0, W:320, H:411

[[myParentView view] addSubview: [myChildeView view]];

我的孩子在添加时比父母大,并且不会将其框架调整为父边界。我不能在父级上使用“剪辑子视图”,如果父级框架未再次调整大小,则“自动调整子视图”似乎不起作用。是否存在使子视图自动调整为其父级边界而不对每个子级使用setFrame的属性?

6 个答案:

答案 0 :(得分:32)

如果您没有使用自动布局,您是否尝试过设置子视图的自动调整大小?试试这个:

myChildeView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
                                 UIViewAutoresizingFlexibleHeight);

此外,您可能需要致电

myParentView.autoresizesSubviews = YES;

使父视图在其帧更改时自动调整其子视图的大小。

如果您仍然在父视图框架之外看到子视图绘图,则父视图很可能不会剪切其内容。要解决此问题,请致电

myParentView.clipsToBounds = YES;

答案 1 :(得分:12)

只需将父视图的框架复制到子视图,然后添加它即可。之后,自动调整将起作用。实际上你应该只复制大小CGRectMake(0,0,parentView.frame.size.width,parentView.frame.size.height)

childView.frame = CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height);
[parentView addSubview:childView];

答案 2 :(得分:5)

Xcode 9.4,Swift 4 中进行了测试  解决此问题的另一种方法是,您可以添加

override func layoutSubviews() {
        self.frame = (self.superview?.bounds)!
    }

在子视图类中。

答案 3 :(得分:2)

这就是您所需要的

childView.frame = parentView.bounds

答案 4 :(得分:0)

您始终可以在UIViews - (void)didMoveToSuperview方法中执行此操作。从父项添加或删除时将调用它(删除后为nil)。在那个时间点,只需将您的尺寸设置为您父母的尺寸。从那时起,自动调整大小的掩码应该可以正常工作。

答案 5 :(得分:0)

使用显式约束进行Swift 4扩展:

import UIKit.UIView

extension UIView {
    public func addSubview(_ subview: UIView, stretchToFit: Bool = false) {
        addSubview(subview)
        if stretchToFit {
            subview.translatesAutoresizingMaskIntoConstraints = false
            leftAnchor.constraint(equalTo: subview.leftAnchor).isActive = true
            rightAnchor.constraint(equalTo: subview.rightAnchor).isActive = true
            topAnchor.constraint(equalTo: subview.topAnchor).isActive = true
            bottomAnchor.constraint(equalTo: subview.bottomAnchor).isActive = true
        }
    }
}

用法:

parentView.addSubview(childView) // won't resize (default behavior unchanged)
parentView.addSubview(childView, stretchToFit: false) // won't resize
parentView.addSubview(childView, stretchToFit: true) // will resize