2017-12-13 14 views
0

私は、境界が丸いセルを持つ静的なテーブルビューを持っています。私は、私の自動レイアウトの制約が働いている間に境界線が常に正しい幅ではないということを、異なるシミュレータでテストすることに気づきました。この特定の画面は、UIViewが埋め込まれたビューコントローラで構成されています。tableViewControllerviewDidAppearでUIを正しく設定することはできますか? viewWillAppear/viewDidLoadではなく

私はいくつかの調査を行いましたが、実際にはストーリーボードの幅に依存しています。これは、iPhone 8用のストーリーボードを持っていると、8+のセルが短すぎることになり、8+のストーリーボードでは、8のストーリーボードで長すぎる(そしてスクリーンから外れる)という結果になります。

現在私はviewDidAppear以内にこのコードを実行する場合

- (void)configureCellThree { 
    //Add Border 
    CALayer *borderLayer = [CALayer layer]; 
    CGRect borderFrame = CGRectMake(0, 0, (_contentCellThree.frame.size.width), (_contentCellThree.frame.size.height)); 
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]]; 
    [borderLayer setFrame:borderFrame]; 
    [borderLayer setCornerRadius:_contentCellThree.frame.size.height/2]; 
    [borderLayer setBorderWidth:1.0]; 
    [borderLayer setBorderColor:[kTextColor2 CGColor]]; 
    // [borderLayer setOpacity:0.5]; 
    [_contentCellThree.layer addSublayer:borderLayer]; 
} 

は今、すべてが両方のデバイス間で動作します。私はのviewDidLoadでセルの枠線を設定しています、ここで私は、セルの境界線を設定するために使用していたコードです。私はいくつかのログをメインビューコントローラに追加して、どのように設定されているかを調べました。

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSLog(@"VDL - SELF.VIEW = %@", self.view); 
    NSLog(@"VDL - CONTAINER VIEW = %@", self.profileScrollingContainerView); 
} 

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

    NSLog(@"VDA- SELF.VIEW = %@", self.view); 
    NSLog(@"VDA - CONTAINER VIEW = %@", self.profileScrollingContainerView); 
} 

私はのviewDidLoadは、ストーリーボードの代わりに、(右ていないようだ)ビュー自体からのサイジング情報を使用していたことを疑われていました。このログによってこれが確認されます。 UIViewが私のテーブルビューの表示を担当している場合、ストーリーボードが8+に設定されている場合、それは次のフレーム属性:X = 0, Y = 349, W = 414, H = 338を持っています。今度はログの結果を見てみましょう。

VDL - SELF.VIEW = <UIView: 0x7fa545401f10; frame = (0 0; 375 667); 
VDL - CONTAINER VIEW = <UIView: 0x7fa545401b50; frame = (0 349; 414 338); 


VDA- SELF.VIEW = <UIView: 0x7fa545401f10; frame = (0 64; 375 603); 
VDA - CONTAINER VIEW = <UIView: 0x7fa545401b50; frame = (0 285; 375 269); 

ビューが読み込まれると、ビューサイズに関する誤った情報が表示されます。 viewDidAppearが呼び出されると、ビューのサイズが正しく設定され、正しく動作します。私の問題は、私のviewDidAppearで初期化コードを呼び出すことはしたくないということです。

I read here that I should be putting my UI Geometry code into the viewWillAppearただし、これを試しても同じ問題が発生します。

VWA - CONTAINER VIEW = <UIView: 0x7fec04d97700; frame = (0 349; 414 338); 

私の質問を統合するには、ビューをロード/表示する前にビューのプロパティを取得してUIを正しく設定するにはどうすればよいですか?

UIViewのサブクラス化が必要であり、潜在的にはsetFrameを使用する必要があることを読んだが、実際にこれをどうやってどうやって行っているのかわからない。

答えて

0

私は間違った方法でこれを行っていました。 I found this question which solved my whole issue.基本的にUIの計算(カスタムビューの追加など)が必要な場合は、-(void)viewDidLayoutSubviewsで実行する必要があります。このメソッドは、ビューがそのサイジングと制約をすべて処理した後に呼び出されるので、ここで行うことはビューの適切なプロパティを使用して実行されます。

関連する問題