gpt4 book ai didi

ios - 在 initWithCoder : 上查看 1000x1000

转载 作者:行者123 更新时间:2023-12-01 20:00:07 29 4
gpt4 key购买 nike

有几个问题在 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 点,并将该 View 分配为此自定义类 MCProgressBarView我在用。当应用程序运行时, initWithCoder运行并创建一个大小为 1000x1000 点的进度 View ,而不管 View 在 IB 上的大小。

如何强制 initWithCoder 以在 IB 上分配的正确大小运行?

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

最佳答案

TL;DR: 将你的框架/边界逻辑移动到 viewDidLayoutSubviews .
initWithCoder:执行帧逻辑是不安全的。您应该使用 viewDidLayoutSubviews为了那个原因。 Apple 从 iOS 10 开始使用 1000x1000 边界。目前尚不清楚是 bug 还是故意的,但它似乎有一个净积极的结果——人们来这里询问它。 ;-)
事实上,initWithCoder:这种逻辑从来都不是安全的。过去,您的 View 边界将是 iPhone 5 屏幕的边界,因为这是您在 IB 中使用的,但随后该 View 将增长到 iPhone 6 Plus 尺寸或 iPad 尺寸,这会导致视觉问题。

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

关于ios - 在 initWithCoder : 上查看 1000x1000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40195814/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com