查看initWithCoder上的1000x1000:



在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,我不想在运行时通过代码设置它。有办法解决这个问题吗?

TL;DR:将frame/bounds逻辑移至viewDidLayoutSubviews

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

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

现在,Apple只是将边界设置为1000x1000,这在所有情况下都是不正确的。一旦在视图上执行布局传递,边界将被纠正。

相关内容

  • 没有找到相关文章

最新更新