如果通过Interface Builder添加,则不能修改UIImageView的框架

我碰到这个非常奇怪的问题,我无法修改UIImageView的框架。

我已经把它隔离到这个非常简单的例子。 从默认的单视图应用程序xcode模板开始,我在Interface Builder中添加一个UIImageView,将其链接到名为testImage的ViewController属性,并在ViewController.m中添加:

-(void)viewDidAppear:(BOOL)animated{ UIImageView* maskImage = [[UIImageView alloc] initWithFrame:self.testImage.frame]; maskImage.image = self.testImage.image; maskImage.alpha = 0; [self.view addSubview:maskImage]; self.testImage.frame = CGRectMake(10, 10, 10, 10); } 

它不起作用。 testing图像坚定地在那里。 如果我不添加maskImage查看,该示例工作。 而且,是的,我确定我不覆盖maskImage的目的地。

如果我不使用IB来放置图像,而是使用:

 self.testImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, 300, 300)]; self.testImage.image = [UIImage imageNamed:@"jim-105.png"]; [self.view addSubview:self.testImage]; 

在viewDidLoad它所有的按预期工作。

我也试图把图像放在IB中,然后在viewDidLoad中设置它的属性,但效果相同。 我一直在Xcode5中尝试这个。 我没有在这里访问以前的Xcode,我不知道这是一个预期的行为(如果是这样,为什么),或者这是一个错误?

如果您使用的是自动布局,我期望的是您所描述的行为,在重新应用约束时,尝试调整frame尝试可能会受挫(这可能会发生在最偶然的事件上,比如向主视图添加另一个视图)和frame将被重新计算。 如果您有一个带约束的自动布局视图,要更改其大小,请更改其约束。

如果您想知道为什么以编程方式创build的testImage按预期工作,那是因为默认情况下,以编程方式创build的视图具有translatesAutoresizingMaskIntoConstraints打开。 因此,尝试改变frame仍然存在。

如果使用自动布局并想更改frame ,可以通过在Interface Builder中为约束添加IBOutlet引用来完成此操作。 假设您的视图具有顶部,顶部,宽度和高度限制。 然后你可以改变它的框架(在这个例子中, CGRect(0, 100, 300, 200) ):

 self.imageViewLeadingConstraint.constant = 0; self.imageViewTopConstraint.constant = 300.0; self.imageViewWidthConstraint.constant = 300; self.imageViewHeightConstraint.constant = 200; 

显然,你需要这四个IBOutlet引用,但是一旦你这样做了,这很容易。