2015-08-25 39 views
1

当使用auto layout时,视图的大小在初始化时是未知的,这给我带来了一个问题。iOS:UIView可以知道它的布局过程已完成吗?

当使用UIImageView,我写了一个类,可以通过图像URL不同大小设置为UIImageView,我​​存储一个图像,以区别设备可以加载它真正需要的尺寸从我自己的​​加载图像。

我想让我的UIImageView能够加载所需分辨率的URL,但是当我的UIImageView获取该URL时,其大小尚未由auto layout决定。

那么有没有办法让UIView知道它的布局过程第一次完成?

回答

4

有一个UIView的方法,你可以覆盖它。

-(void)layoutSubviews { 
    CGRect bounds =self.bounds; 
    //build your imageView's frame here 
    self.imageView=imageViewFrame. 
} 
0

不幸的是,没有简单的方法可以通知UIView已经设置了它的约束条件。你可以尝试一堆不同的东西,但是,

实现layoutSubviews功能UIView,这是每当UIView的布局被改变时调用。

执行的viewDidLayoutSubviews它有它。此功能在所有布局设置完成后调用。此时,您可以使用您的类别功能。

-1

这里是一个测试,我只使用自动布局,我只使用自定义子类的子视图。我在子类的初始化所有的汽车布局:

这是一个“登录按钮”有没有框架,但随后与自动布局设置:

-(void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewDidLayoutSubviews"); 
    } 
} 

-(void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewWillLayoutSubviews"); 
    } 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"didAppear"); 
    } 
} 

-(void)viewWillAppear:(BOOL)animated { 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewWillAppear"); 
    } 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewDidLoad"); 
    } 
} 

这里的输出。所以,这意味着,我认为终于有一个帧时的

2015年8月25日01:28:27.789 [67502:1183631] viewDidLayoutSubviews

2015年8月25日01:28:27.790 [ 67502:1183631] viewWillLayoutSubviews

2015年8月25日01:28:27.790 [67502:1183631] viewDidLayoutSubviews

2015年8月25日01:28:28.007 [67502:1183631] didAppear

这意味着第一次登录按钮有一个框架在viewDidLayoutSubviews中,这看起来很奇怪,因为这是主视图子视图的第一遍。 ViewWillAppear中没有框架,尽管viewcontroller本身的视图已经设置在登录按钮之前。当viewcontroler的视图被设置时,整个UIView子类的主视图也被设置,这也发生在登录按钮之前。因此,视图的子视图是在父视图设置后设置的。

重点是这样的:如果你在viewDidLayoutSubviews中放置了imageview信息拉,那么你就有一个框架可以使用,除非你通过类型转换将这个UIImageView框架设置为ViewController的视图,那么你将拥有UIImageView的框架在viewDidLoad中设置。祝你好运!

+1

那么酷和东西,但'UIView'!='UIViewController' – Laszlo

相关问题