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

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

カスタム コントロールは通常、カスタム コントロールに対して子コントロールを制限するだけで済みます。
カスタム コントロールのサイズは、使用時に制御されます。

いいねを押す +0
伊谢尔伦
  1. 「フレームサイズを設定していない場合、どうすれば正常に表示されますか?」?

    layoutsubviewで設定したサブビューのフレームは高さが固定されているため、例えばproductPriceLabelの幅と高さ(DEVICE_WIDTH-15*2, 18)はすべて値を持ちます(サイズが異なっていても)。自分自身の値は {0,0 }) です。

  2. 子コントロールの位置とサイズに基づいて親ビューのサイズを動的に設定したい場合は、layoutsubviewself のフレームを設定しないことが最善です。サブビューが変更されたときに、親ビューの管理クラスに通知できます (たとえば、親ビューを ViewController のビューに追加した場合、コントローラーで親ビューのフレームを調整します)。

  3. layoutsubview のフレームを設定することは依然として推奨されません。さらに、コントローラーには self メソッドがあります。 viewDidLayoutSubviews

いいねを押す +0
黄舟

質問 1、まだわかりません。サブコントロールのサイズを設定したのに、カスタムコントロールに読み込まれてしまうのですが、なぜサイズが設定されないのでしょうか?
質問2、@鍴君のこの方法も検討しましたが、ロード直後に表示したかったため、一部のプロキシメソッドがロード後に実行されるため、表示に問題がありました。思いつく方法は、viewContrllorでカスタムコントロールのプロキシを実行する
質問3 私はlayoutIfNeedメソッドを使いました 次回はviewDidLayoutSubviewsメソッド

を使ってみます。
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート