Ios 编程自动布局、约束和UIView运行时
在阅读苹果公司的《视图编程指南》时,很明显,他们并没有对其进行更新,以消除限制。有几个问题:Ios 编程自动布局、约束和UIView运行时,ios,uiview,constraints,autolayout,Ios,Uiview,Constraints,Autolayout,在阅读苹果公司的《视图编程指南》时,很明显,他们并没有对其进行更新,以消除限制。有几个问题: 这里的许多帖子都谈到在初始化新的UIView或将其设置为CGRectZero或其他等效项时不使用-initWithFrame。那你怎么处理呢 -(id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self){ //Set up rounded rectangle ivar C
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self){
//Set up rounded rectangle ivar
CGRect frame = [self bounds];
CGFloat radius = frame.size.height / 2;
_rectPath = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:radius];
}
}
然后将绘图代码放入drawRect:。我发现没有框架它无法正确初始化。(显然,我正在初始化这个UIView并立即设置约束,但没有立即设置框架)。此代码集的帧=(0,0,0,0),因为尚未计算约束
如果我们不把这个代码放在init中,我们会把它放在哪里?另外,我认为在init中初始化视图中所需的所有内容是一种很好的做法
所以这就引出了一个问题对所有的问题感到抱歉,但它们似乎都有点关联。谢谢您的外观。您的框架问题与自动布局无关。视图大小一直在变化。它几乎与对象实例化过程中的情况不同。在drawRect期间,而不是在首次创建视图时,需要创建/计算路径的大小以适应当前大小
在
init
期间,您应该设置的唯一对象是类的其余部分在特定状态下依赖的属性和/或IVAR 您的框架问题与自动布局无关。视图大小一直在变化。它几乎与对象实例化过程中的情况不同。在drawRect期间,而不是在首次创建视图时,需要创建/计算路径的大小以适应当前大小
在
init
期间,您应该设置的唯一对象是类的其余部分在特定状态下依赖的属性和/或IVAR 好的,这是有道理的。我想我想说的是,有时候你需要边界信息,而使用autolayout,你不可能一直都能得到这些信息。事实上,似乎只有很少几次。我真的想知道系统在什么时候计算边界?我不确定系统何时在自动布局下计算边界。但是,当您对视图进行子类化时,这并不重要。您只知道在调用drawRect:
时,需要显示当前边界(或仅显示dirtyRect)。如果边界更改对您的实现非常重要,请重写setBounds
。好的,这很有意义。我想我想说的是,有时候你需要边界信息,而使用autolayout,你不可能一直都能得到这些信息。事实上,似乎只有很少几次。我真的想知道系统在什么时候计算边界?我不确定系统何时在自动布局下计算边界。但是,当您对视图进行子类化时,这并不重要。您只知道在调用drawRect:
时,需要显示当前边界(或仅显示dirtyRect)。如果边界更改对实现非常重要,请重写setBounds
。