以编程方式添加子视图非常奇怪

时间:2013-07-31 20:45:51

标签: ios interface-builder

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

使用Interface Builder它非常流畅,只需将它们拖入并发送正确的帧和原点即可。但是我似乎无法设定原点;我尝试expression is not assignable后得到view.frame.origin = CGPointMake(x, y),直接设置xy坐标会给我同样的错误。

是否会发生这种情况,因为如果不设置特殊属性(我缺少),子视图不能以编程方式重叠?

编辑:视图正在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);

2 个答案:

答案 0 :(得分:3)

要避免expression is not assignable,您必须使用

一次设置整个帧
view.frame = CGRectMake(x, y, width, height)

CGRect frame = self.view.frame;
frame.origin.x = newX;
self.view.frame = frame;

答案 1 :(得分:2)

您最有可能在viewDidLoad方法中设置帧。这里的问题是您在根据应用程序的约束调整viewControllers框架之前设置框架。

尝试将框架设置移至方法viewWillAppear,看看是否能解决您的问题。

编辑:因为您在单元格中执行此操作,而不是在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);