2016-10-22 6 views
1

SOにこれを求めるいくつかの質問がありますが、誰もそれを正しく尋ねていません。initWithCoderで1000x1000を表示してください:

私はこの実装でUIViewベースのクラスであるカスタムプログレスバーを使用しています。

@implementation MCProgressBarView { 
    UIImageView * _backgroundImageView; 
    UIImageView * _foregroundImageView; 
    CGFloat minimumForegroundWidth; 
    CGFloat availableWidth; 
} 

- (instancetype)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    // [self bounds] is 1000x1000 here... what? 
    if (self) [self initialize]; 
    return self; 
} 


- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) [self initialize]; 
    return self; 
} 

- (void) initialize { 
    UIImage * backgroundImage = [[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"progress-bg" ofType:@"png"]] 
           resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f)]; 

    UIImage * foregroundImage = [[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"progress-bg" ofType:@"png"]] 
           resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f)]; 

    _backgroundImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 
    _backgroundImageView.image = backgroundImage; 
    [self addSubview:_backgroundImageView]; 

    _foregroundImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 
    _foregroundImageView.image = foregroundImage; 
    [self addSubview:_foregroundImageView]; 

    UIEdgeInsets insets = foregroundImage.capInsets; 
    minimumForegroundWidth = insets.left + insets.right; 

    availableWidth = self.bounds.size.width - minimumForegroundWidth; 

    [self adjustProgress:0.0f]; 
} 

私は200x20のポイントであることをインターフェイスビルダーでUIViewを作成し、私が使用しています。このカスタムクラスMCProgressBarViewのものであると、そのビューを割り当てています。アプリケーションが実行されると、initWithCoderが実行され、1000x1000ポイントのサイズの進捗ビューが作成されます。ビューのサイズはIBでは無視されます。

IBに割り当てられた適切なサイズでinitWithCoderを動作させるにはどうすればよいですか?

注:200x20にハードワイヤ接続したくないので、実行時にこのコードを設定したくありません。この仕事をする方法はありますか?

答えて

2

TL; DR:フレーム/境界ロジックをviewDidLayoutSubviewsに移動します。

initWithCoder:は、フレームロジックの実行には安全ではありません。そのためにはviewDidLayoutSubviewsを使用してください。 AppleはiOS 10から1000x1000の範囲を使用しています。バグや意図的なのかどうかは不明ですが、正の結果が得られるようです。人々がここに来て質問します。 ;-)

実際には、initWithCoder:は、このようなロジックにとって安全ではありませんでした。以前は、iPhone 5の画面の境界線があるのは、IBで使っていたものだからですが、ビューがiPhone 6 PlusサイズまたはiPadサイズに拡大し、視覚的な問題が発生するためです。

Appleは境界を1000x1000に設定していますが、これはすべてのケースで正しくありません。ビューがレイアウトパスを実行すると、境界が修正されます。

+1

UIViewベースのクラスではviewDidLayoutSubviewsはありません。 viewControllerを使用してビューのサイズを正しく設定すると、このことはすべて、AppleがiOS上で多くのことを思い描いていません。 – SpaceDog

+0

@SpaceDog 'layoutSubviews'を使用してください。 –

+0

私はクラスに 'layoutSubviews'を実装しました。そのメソッドが実行されるとき、私は何もしなくてもビューは正しいサイズで表示されますが、アプリケーションに表示されるときは1000x1000です。 – SpaceDog

関連する問題