2016-04-29 9 views
1

私はautolayoutを使用しています。UIScrollViewをUIViewにプログラムで追加すると、viewDidLoadでは機能しませんが、viewDidAppearで機能しますか?

以下のコードのように、プログラムでスクロールビューを追加します。ビューでinitShopViewを実行しようとしていますが、ロードできませんでしたが、それはうまく動作せず、表示するためにscrollviewを追加しません。ビュー階層のキャプチャが表示されています。

class variables: 

@property(strong,nonatomic) UIScrollView *shopScrollView; 
@property(strong,nonatomic) UIView *headView; 
@property(strong,nonatomic) UIButton *favoriteButton; 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self initShopView];// not work 

} 

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    [self initShopView];// will work 
} 

-(void)initShopView{ 
    self.shopScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.superview.frame.size.height - slideTitleHeight)]; 
    self.shopScrollView.contentSize = CGSizeMake(self.view.frame.size.width, 800); 
    self.headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 100)]; 

    self.favoriteButton = [[UIButton alloc]initWithFrame:CGRectMake(self.view.frame.size.width - 60, 10, 55, 55)]; 
    [self.favoriteButton setTitle:@"Favorite" forState:UIControlStateNormal]; 
    [self.favoriteButton setImage:[UIImage imageNamed:@"favoriteGreen.png"] forState:UIControlStateNormal]; 



    [self.headView addSubview:self.favoriteButton]; 
    [self.shopScrollView addSubview:self.headView]; 
    [self.view addSubview:self.shopScrollView]; 
} 

@Phillip Millsが解決策を与える。私のスクロールビューのフレームは

self.shopScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.superview.frame.size.height - slideTitleHeight)]; 

し、溶液は次のとおりです。

self.shopScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - slideTitleHeight)]; 
+0

どこでautolayoutを使用していますか?プログラムで作成されたビューの場合、プログラムによってautolayoutを追加する必要があります。 –

答えて

3

には、まだビュー階層に挿入されていないため、ビューにはsuperviewがありません。つまり、スクロールビューの高さを0に設定しています。

Xcodeのビューデバッグを使用すると、リストに「間違った」フレームが表示されます。

+0

はい、あなたは正しいです、私はスクロールビューのフレーム= CGRectMake(0、0、self.view.frame.size.width、self。 view.frame.size.height - slideTitleHeight)];そしてそれは動作します –

0

これは、ビューの実際のレイアウト(フレーム)を取得しているviewDidAppear方法でb'cozです。

viewDidLoadで作業するには、[self initShopView];メソッドのすぐ上でこれらのメソッドを呼び出す必要があります。

[self setNeedsLayout];

[self layoutIfNeeded];

注:自動レイアウトを使用している場合は、ビューの枠を設定することは推奨されません。正しい位置に配置するための制約を与えるだけです。

+0

あなたは意味ですか:[self.view setNeedsLayout]; [self.view layoutIfNeeded] ;?私はちょうどinitShopViewの前にロードされたビューでこれらのメソッドを呼び出そうとすると、まだ動作しません。 –

0

フレームを作成する代わりに、AutoLayoutを使用してビューを設定します。これは、viewDidLoadでも同様に動作します。 フレームは、ビューレンダリングをより複雑にし、すべてのデバイスサイズで正しく機能しません。

関連する問題