0

私は自分自身で IOS 開発を学んでいますが、私がやろうとしている演習の 1 つで問題が発生しています。基本的に、表示したい写真のリストがあるので、これらの写真のリストを含むテーブルビューを作成しました。目標は、セルをクリックして、画面のサイズに自動ズームする写真を表示することです。自分でメモリを管理する方法を学べるように、ARC をオフにしています。

テーブル ビューでセルを選択すると、スクロール ビューとイメージ ビューを持つ UIViewController が呼び出されます。

絵コンテのスナップショット

これは私がアウトレットを接続した方法です:

コンセントの接続方法

メソッド viewWillAppear の下の PhotoViewController の実装で、次のコードを書きました。

- (void) viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

[self.scrollView setZoomScale:1 animated:NO];
CGSize boundsSize = self.scrollView.bounds.size;
NSLog(@"@@@AMRO scrollboundsSize  is width %f and height %f", boundsSize.width, 
boundsSize.height);   

写真をズームする方法を理解するには、boundsSize が必要です。問題は、常にゼロを読み取ることです。ストーリーボードに基づいて知っていますが、boundsSize は 320x455 です。明らかに、ハードコーディングしたくありません。

その PhotoViewController の .h で、次のように定義しました。

@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

ViewWillAppear の場合は、次のようにします。

CGRect fullScreenRect=[[UIScreen mainScreen] applicationFrame];
self.scrollView=[[UIScrollView alloc] initWithFrame:fullScreenRect];

次に、境界を定義しますが、サイズはオフで、幅は 320.000000、高さは 548.000000 です。548という高さは、おそらくタイトルバーと下部のタブバーを含んでいるためと理解しています。ストーリー ボードに表示されている 320 x 455 の表示に基づいて境界を正しく設定する方法はありますか。私は同じことをしている人々の他のコードスニペットを見ましたが、彼らはscrollViewを割り当てさえしていません.ARCがオンであり、それは自動的に管理されるものなのでしょうか?

このアプローチを使用すると、正しいサイズが得られますが、これは正しいアプローチですか?スクロールビューが初期化されていないにもかかわらず、境界が正しく設定されている例を見てきました

CGRect viewBounds = self.view.bounds;
self.scrollView=[[UIScrollView alloc] initWithFrame:viewBounds];
4

2 に答える 2

3

メソッドを使用して、viewDidAppearの代わりに境界やその他のサイズを取得してみてくださいviewWillAppear

の実行時に、スクロールビューの境界がまだ初期化されていない可能性がありますviewWillAppear

于 2013-10-13T19:51:16.980 に答える
1

ビューが画面に表示される前にジオメトリ関連のコードを実行する必要がある場合は、viewDidLayoutSubviews に配置できます。

@interface CustomViewController ()

@property (nonatomic) BOOL isFirstTimeViewDidLayoutSubviews; // variable name could be re-factored

@end

@implementation CustomViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.isFirstTimeViewDidLayoutSubviews = YES;
}

- (void)viewDidLayoutSubviews
{
    // only after layoutSubviews executes for subviews, do constraints and frames agree (WWDC 2012 video "Best Practices for Mastering Auto Layout")

    if (self.isFirstTimeViewDidLayoutSubviews) {

        // execute geometry-related code...
    }

    self.isFirstTimeViewDidLayoutSubviews = NO;
}
于 2013-10-14T01:38:00.060 に答える