在initWithCoder上查看1000x1000:

时间:2016-10-22 18:51:11

标签: ios iphone ipad uiview initwithcoder

有几个问题在SO上提出这个问题,但没有人问这个问题。

我正在使用自定义进度条,这是一个基于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];
}

我在界面构建器上创建了一个UIView为200x20点,并将该视图指定为我正在使用的自定义类MCProgressBarView。应用程序运行时,initWithCoder会运行并创建大小为1000x1000点的进度视图,而忽略视图在IB上的大小。

如何强制initWithCoder以IB上指定的正确大小运行?

注意:我不想硬连接到200x20,我不想在运行时通过代码设置它。有没有办法使这项工作?

1 个答案:

答案 0 :(得分:2)

TL; DR:将您的帧/边界逻辑移至viewDidLayoutSubviews

initWithCoder:对于执行帧逻辑不安全。您应该使用viewDidLayoutSubviews。从iOS 10开始,Apple使用1000x1000的界限。目前还不清楚bug还是故意的,但似乎有一个净积极的结果 - 人们来到这里询问它。 ;-)

事实上,initWithCoder:从来没有对这种逻辑安全。在过去,你有一个视图,其边界将是iPhone 5的屏幕,因为这是你在IB中使用的,但随后视图将增长到iPhone 6 Plus大小或iPad大小,这将导致视觉问题。

现在,Apple只将界限设置为1000x1000,这对所有情况都不正确。一旦在视图上执行布局传递,就会更正边界。