有几个问题在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,我不想在运行时通过代码设置它。有没有办法使这项工作?
答案 0 :(得分:2)
TL; DR:将您的帧/边界逻辑移至viewDidLayoutSubviews
。
initWithCoder:
对于执行帧逻辑不安全。您应该使用viewDidLayoutSubviews
。从iOS 10开始,Apple使用1000x1000的界限。目前还不清楚bug还是故意的,但似乎有一个净积极的结果 - 人们来到这里询问它。 ;-)
事实上,initWithCoder:
从来没有对这种逻辑安全。在过去,你有一个视图,其边界将是iPhone 5的屏幕,因为这是你在IB中使用的,但随后视图将增长到iPhone 6 Plus大小或iPad大小,这将导致视觉问题。
现在,Apple只将界限设置为1000x1000,这对所有情况都不正确。一旦在视图上执行布局传递,就会更正边界。