有没有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
是从center
, bounds
和transform
派生的,所以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 }