有没有UIViewresize事件?

我有一个视图,其中有图像的行和列。

如果此视图resize,我需要重新排列图像浏览位置。

这个视图是被resize的另一个视图的子视图。

有什么方法可以检测这个视图的大小?

正如Uli在下面评论的,正确的方法是覆盖layoutSubviews并在那里布局imageViews。

如果由于某种原因,你不能inheritance和重写layoutSubviews ,那么即使是脏的时候,观察bounds应该可以工作。 更糟的是,观察的风险很大 – 苹果不保证KVO在UIKit类上工作。 在这里阅读与苹果工程师的讨论: 什么时候发布关联对象?

原来的答案:

你可以使用键值观察:

 [yourView addObserver:self forKeyPath:@"bounds" options:0 context:nil]; 

并执行:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == yourView && [keyPath isEqualToString:@"bounds"]) { // do your stuff, or better schedule to run later using performSelector:withObject:afterDuration: } } 

Swift中 ,你可以这样做:

 override var bounds: CGRect { didSet { // Do stuff here } } 

创buildUIView的子类,并重写layoutSubviews

你可以创build一个UIView的子类并覆盖

SETFRAME:(的CGRect)帧

方法。 这是在视图的框架(即大小)改变时调用的方法。 做这样的事情:

 - (void) setFrame:(CGRect)frame { // Call the parent class to move the view [super setFrame:frame]; // Do your custom code here. } 

很老,但仍然是一个很好的问题。 在苹果的示例代码和一些私有的UIView子类中,它们大致覆盖了setBounds:

 -(void)setBounds:(CGRect)newBounds { BOOL const isResize = !CGSizeEqualToSize(newBounds.size, self.bounds.size); if (isResize) [self prepareToResizeTo:newBounds.size]; // probably saves [super setBounds:newBounds]; if (isResize) [self recoverFromResizing]; } 

重写setFrame:不是一个好主意。 frame是从centerboundstransform派生的,所以iOS不一定会调用setFrame:

Swift 4 keypath KVO – 这是我如何检测自动旋转并移动到iPad侧面板。 应该工作的任何看法。 必须观察UIView的层。

 private var observer: NSKeyValueObservation? override func viewDidLoad() { super.viewDidLoad() observer = view.layer.observe(\.bounds) { object, _ in print(object.bounds) } // ... } override func viewWillDisappear(_ animated: Bool) { observer?.invalidate() //... } 

如果你在一个UIViewController实例中,覆盖viewDidLayoutSubviews做到这一点。

 override func viewDidLayoutSubviews() { // update subviews }