我遇到了这个非常特殊的问题,我无法修改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);
}
它不起作用。测试图像保持坚定的位置。如果我没有添加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,我不确定这是一个预期的行为(如果是这样的话)或者这是一个错误?
答案 0 :(得分:8)
如果您使用自动布局,我会期待您描述的行为,在重新应用约束时可能会阻止调整frame
的尝试(这可能发生在最常见的事件中,例如将另一个视图添加到主视图中)将重新计算frame
。如果您有带约束的自动布局视图,要更改其大小,请更改其约束。
如果您想知道为什么以编程方式创建的testImage
按预期工作,那是因为默认情况下,以编程方式创建的视图已启用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
引用,但是一旦你这样做,就很容易了。