我有一个视图,其中包含imagerait的行和列.
如果调整此视图的大小,我需要重新排列imageviews位置.
此视图是另一个调整大小的视图的子视图.
有没有办法检测何时调整此视图的大小?
Mic*_*hal 93
正如Uli在下面评论的那样,正确的方法是覆盖layoutSubviews
和布局imageViews.
如果由于某种原因,你不能进行子类化和覆盖layoutSubviews
,那么观察bounds
应该可以工作,即使是有点脏.更糟糕的是,观察存在风险 - Apple不保证KVO可以在UIKit类上运行.在这里与Apple工程师一起阅读讨论:关联对象什么时候发布?
原始答案:
您可以使用键值观察:
[yourView addObserver:self forKeyPath:@"bounds" options:0 context:nil];
Run Code Online (Sandbox Code Playgroud)
并实施:
- (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:
}
}
Run Code Online (Sandbox Code Playgroud)
Rud*_*vič 88
在UIView
子类中,可以使用属性观察者:
override var bounds: CGRect {
didSet {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有子类化,使用智能键路径进行键值观察将会:
var boundsObservation: NSKeyValueObservation?
func beginObservingBounds() {
boundsObservation = observe(\.bounds) { capturedSelf, _ in
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
gwa*_*ang 30
创建UIView的子类,并覆盖layoutSubviews
相当古老但仍然是一个很好的问题.在Apple的示例代码中,以及在它们的一些私有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];
}
Run Code Online (Sandbox Code Playgroud)
覆盖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()
//...
}
Run Code Online (Sandbox Code Playgroud)
您可以创建UIView的子类并覆盖
SETFRAME:(的CGRect)帧
方法.这是在更改视图的帧(即大小)时调用的方法.做这样的事情:
- (void) setFrame:(CGRect)frame
{
// Call the parent class to move the view
[super setFrame:frame];
// Do your custom code here.
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
66427 次 |
最近记录: |