首先问题是这样的,我自定义了一个UIView,刚开始是在LayoutSubView的方法里先设置了子控件的frame,然后又根据最有一个子控件的大小设置整个frame的大小,代码如下:-(void) layoutSubviews
{
[self.productImgScrollView setFrame:CGRectMake(0, 0, DEVICE_WIDTH, DEVICE_WIDTH)];
[self.productNameLabel setFrame:CGRectMake(15, _productImgScrollView.frame.size.height+18, DEVICE_WIDTH-15*2, 18)];
[self.productPriceLabel setFrame:CGRectMake(15, self.productNameLabel.frame.origin.y+self.productNameLabel.frame.size.height+18, DEVICE_WIDTH-15*2, 18)];
if(self.product.discount!=nil)//有打折时
{
[self.productCountLabel setFrame:CGRectMake(15, self.productPriceLabel.frame.origin.y+self.productPriceLabel.frame.size.height+10, DEVICE_WIDTH-15*2, 13)];
[self createFeatureView:_productCountLabel.frame.origin.y+_productCountLabel.frame.size.height+20];
}else//无打折时
{
[self createFeatureView:_productPriceLabel.frame.origin.y+_productPriceLabel.frame.size.height+20];
}
//设置brandBar
[self createBrandToolBar:self.featureOne.frame.origin.y+self.featureOne.frame.size.height+20];
[self setFrame:CGRectMake(0, 0, DEVICE_WIDTH, self.brandToolBar.frame.origin.y+self.brandToolBar.frame.size.height)]; }
嗯,就是上面这个方法的最后一句,没有在initWithFrame这个方法中设置frame的大小。然后在ViewController里初始化这个自定义的视图(使用的是init方法,也没有设置frame的大小,因为考虑到在layoutsubview方法中已经把frame设置了),然后addSubview到控制器的视图中。但是在添加试图后,使用这个View的.frame.size方法得到的frame的size为(0,0)。此时视图可以正常显示,一切正常。
然后做了尝试,在自定义UIView的InitWithFrame方法中,对frame进行初始化,这是在控制器中是可以获得frame的size的大小的(也就是我在initWithFrame中设置的值),此时感觉问题应该是在我将自定义的view添加到控制器之后,打印frame的大小,此时可能还没有执行layoutsubview的方法,所以还没有设置frame的size的尺寸。
然后问题来了,我尝试在自定义View的initWithFrame和LayoutSubview的方法中都不设置frame的大小,此时,在控制其中,视图竟然也能正常显示,设置背景色显示正好是子控件的大小。
问题1:这里我没有设置frame的大小啊,怎么也能正常显示呢,在layoutsubview中打印frame的大小也是(0,0),这是怎么回事,是父视图可以根据子视图的尺寸自动调整大小吗?
问题2:如果我想根据子控件的位置及大小动态设置父视图的大小,在哪个方法中设置frame的尺寸呢?还是不设置显示都没有问题。
问题3:如果我在sublayoutSubView中设置frame的大小,那么我在控制器中什么时候才能得到执行完sublayuoutSubView这个方法后,frame的尺寸。
사용자 정의 컨트롤은 일반적으로 사용자 정의 컨트롤을 기준으로 하위 컨트롤만 제한하면 됩니다.
사용자 정의 컨트롤의 크기는 사용할 때 제어됩니다.
"프레임 크기를 설정하지 않은 경우 어떻게 정상적으로 표시되나요?"
layoutsubview
에서 설정한 하위 뷰의 프레임은 높이가 고정되어 있기 때문입니다. 예를 들어productPriceLabel
의 너비와 높이(DEVICE_WIDTH-15*2, 18)는 모두 값을 갖습니다(크기가 달라도). 자기 자신은 {0,0 })입니다.자식 컨트롤의 위치와 크기에 따라 상위 뷰의 크기를 동적으로 설정하려면
layoutsubview
에서self
프레임을 설정하지 않는 것이 가장 좋습니다. 하위 뷰가 변경되면 상위 뷰의 관리 클래스에 알릴 수 있습니다(예를 들어 ViewController의 뷰에 상위 뷰를 추가한 다음 컨트롤러에서 상위 뷰의 프레임을 조정하는 경우).은 여전히
layoutsubview
에서self
의 프레임을 설정하지 않는 것이 좋습니다. 또한 컨트롤러에는viewDidLayoutSubviews
메서드가 있습니다.질문 1. 아직도 이해가 안 되네요. 하위 컨트롤의 크기를 설정했는데 사용자 정의 컨트롤에 로드됩니다. 왜 크기가 설정되지 않습니까?
질문 2, @鍴君 이 방법도 고려했는데 방금 로드했을 때 표시하고 싶었기 때문에 로드 후 일부 프록시 메서드가 실행되어 표시에 문제가 있었습니다. 생각나는 방법은 viewContrllor에서 커스텀 컨트롤의 프록시를 실행하는 것입니다
질문 3 저는layoutIfNeed 메소드를 사용했습니다.다음에는 viewDidLayoutSubviews 메소드를 사용해 보겠습니다