Ios 以编程方式添加子视图会使其位置异常

Ios 以编程方式添加子视图会使其位置异常,ios,interface-builder,Ios,Interface Builder,我有一个视图,我想在其中添加多个子视图,但是当我添加它们时,它们会定位在我没有设置框架的位置。x坐标是正确的,但是y非常不正确 使用Interface Builder,它运行得非常顺利,只需将它们拖进去并发送正确的帧和原点。但是,我似乎无法设置原点;当我尝试view.frame.origin=CGPointMake(x,y)时,我得到的表达式是不可赋值的,设置x和y坐标直接给我同样的错误 发生这种情况是因为子视图在没有设置特殊属性(我缺少)的情况下不能以编程方式重叠吗 编辑:在UITableVi

我有一个视图,我想在其中添加多个子视图,但是当我添加它们时,它们会定位在我没有设置框架的位置。
x
坐标是正确的,但是
y
非常不正确

使用Interface Builder,它运行得非常顺利,只需将它们拖进去并发送正确的帧和原点。但是,我似乎无法设置原点;当我尝试
view.frame.origin=CGPointMake(x,y)
时,我得到的
表达式是不可赋值的
,设置
x
y
坐标直接给我同样的错误

发生这种情况是因为子视图在没有设置特殊属性(我缺少)的情况下不能以编程方式重叠吗

编辑:在UITableViewCell的
initWithStyle
方法中设置视图

编辑2:在
initWithStyle
方法中添加代码

// Initialize images
self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
self.anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"anImage"]];
self.anotherImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"anotherImage"]];

// Set imageview locations
self.imageView.frame = CGRectMake(0, 0, 300, 54);
self.anImageView.frame = CGRectMake(20, 53, 16, 52);
self.anotherImageView.frame = CGRectMake(179, 43, 111, 53);

要避免表达式不可赋值,必须使用

view.frame = CGRectMake(x, y, width, height)


要避免表达式不可赋值,必须使用

view.frame = CGRectMake(x, y, width, height)


很可能是在
viewDidLoad
方法中设置帧。这里的问题是,在根据应用程序的约束调整viewControllers帧的大小之前设置帧

尝试将帧设置移动到方法
视图将出现
,看看这是否解决了问题

编辑:因为您是在单元格中执行此操作,而不是在viewController中执行此操作,所以您可以执行以下操作:

initWithStyle:reuseIdentifier

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        self.customView = [[UIView alloc] initWithFrame:CGRectZero];

    }

    return self;
}
然后覆盖
layoutSubviews
以实际设置视图框架

- (void)layoutSubviews
{  
    [super layoutSubviews];

    self.customView.frame = CGRectMake(x, y, width, height);
}
就“表达式不可指定”警告而言,这是因为在不设置高度和宽度的情况下,不能仅设置视图原点。使用:

view.frame = CGRectMake(x, y, width, height);
如果您想保持相同的宽度和高度,而不需要硬编码,可以执行以下操作

view.frame = CGRectMake(x, y, view.frame.size.width, view.frame.size.height);

很可能是在
viewDidLoad
方法中设置帧。这里的问题是,在根据应用程序的约束调整viewControllers帧的大小之前设置帧

尝试将帧设置移动到方法
视图将出现
,看看这是否解决了问题

编辑:因为您是在单元格中执行此操作,而不是在viewController中执行此操作,所以您可以执行以下操作:

initWithStyle:reuseIdentifier

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        self.customView = [[UIView alloc] initWithFrame:CGRectZero];

    }

    return self;
}
然后覆盖
layoutSubviews
以实际设置视图框架

- (void)layoutSubviews
{  
    [super layoutSubviews];

    self.customView.frame = CGRectMake(x, y, width, height);
}
就“表达式不可指定”警告而言,这是因为在不设置高度和宽度的情况下,不能仅设置视图原点。使用:

view.frame = CGRectMake(x, y, width, height);
如果您想保持相同的宽度和高度,而不需要硬编码,可以执行以下操作

view.frame = CGRectMake(x, y, view.frame.size.width, view.frame.size.height);

我正在使用UITableViewCell的
initWithStyle
方法。是否有一种特殊的单元格方法,其行为类似于
viewwillbeen
?我仍然遇到同样的问题,尽管我还没有尝试使用自定义视图。在contentView中不可能吗?您在哪里创建要设置框架的视图?这是从interface builder创建的,还是在initWithStyle方法中创建视图?所有视图都是在
initWithStyle
中创建的。我尝试将其移动到
layoutSubviews
,但没有成功。我正在使用UITableViewCell的
initWithStyle
方法。是否有一种特殊的单元格方法,其行为类似于
viewwillbeen
?我仍然遇到同样的问题,尽管我还没有尝试使用自定义视图。在contentView中不可能吗?您在哪里创建要设置框架的视图?这是从interface builder创建的,还是在initWithStyle方法中创建视图?所有视图都是在
initWithStyle
中创建的。我试图将其移动到
layoutSubviews
,但没有成功。啊,是的,没错。我完全误解了起源属性。我认为这就像界面生成器一样,我将原点设置为左上角或右下角。我已经在使用
CGRectMake
实现您提到的目的。我以为如果我把原点设置在视图的左下角,它会自动变成这样,但是我太傻了。啊,是的,这是真的。我完全误解了起源属性。我认为这就像界面生成器一样,我将原点设置为左上角或右下角。我已经在使用
CGRectMake
实现您提到的目的。我以为如果我把原点设置在视图的左下角,它会自动变成这样,但我真是太傻了。很难从代码中看出哪里出了问题。您正在将这些视图添加到您的单元格中吗?([cell.contentView addSubview:view])?我知道你肯定应该在layoutSubview中设置框架。是的,我正在调用
layoutSubview
方法中的
[self.contentView addSubview:self.imageView]
,但是如果可能的话,图像视图是水平放置的,但是,大图像(即
self.imageView
)向下推其他imageview,就好像空间只能被单个imageview占用一样。我将在init方法中执行addSubview,这样您只需添加它们一次(布局子视图被多次调用)。我想我真的不知道发生了什么事而没有看到它。基于上面列出的帧的屏幕截图可能有助于判断代码出错的地方。您正在将这些视图添加到您的单元格中吗?([cell.contentView addSubview:view])?我知道您肯定应该在layoutSubview中设置框架。是的,我正在调用
layoutSubview中的
[self.contentView addSubview:self.imageView]