ios - 自定义UIView时,frame的大小合适确定,在initWithFramezhong还是在LayoutSubView时确定?
PHPz
PHPz 2017-04-18 09:53:49
0
3
641

首先问题是这样的,我自定义了一个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的尺寸。


PHPz
PHPz

学习是最好的投资!

全部回覆(3)
阿神

自訂控制項 一般只需要約束好子控制相對於你自訂控制項的約束就好了
自訂控制項的大小是在你使用的時候再去控制的,你也可以給他一個預設的大小.

伊谢尔伦
  1. "沒有設定frame的大小啊,怎麼也能正常顯示呢"?

    因為你在 layoutsubview 中设置子视图的frame是有固定高度的 比如 productPriceLabel 的寬高(DEVICE_WIDTH-15*2, 18)都是有值(即便self的size為{0,0})的。

  2. 如果想根據子控制項的位置及大小動態來設定父視圖的大小,那麼也最好不要在layoutsubview中设置 self的frame。可以在子視圖變更的時候去通知父視圖的管理類別(比如說你把父視圖加入到ViewController的視圖上,那就在控制器中調整父視圖的frame)。

  3. 仍然是不建議在layoutsubview中设置 self的frame。另外控制器有个 viewDidLayoutSubviews的frame。另外控制器有個 viewDidLayoutSubviews 方法。

黄舟

問題1,還是沒有搞懂。雖然我設定了子控制項的尺寸,但是是載入在自訂控制項上的,自訂控制項沒設定大小,為什麼也可以呢?
問題2,我後來也是考慮了@饅頭君的這個方法,但是因為之前是想在剛加載的時候就顯示,所以有些代理方法是在加載之後才執行的,所以顯示有問題。想到的方法是,將自訂控制項的代理程式在viewContrllor中執行
問題3 我用的是layoutIfNeed這個方法,下次再試試使用viewDidLayoutSubviews這個方法

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板