hfo*_*sli 77 iphone objective-c key-value-observing uiview ios
我想看了在变化UIView的frame,bounds或center财产.我如何使用Key-Value Observing来实现这一目标?
hfo*_*sli 68
通常会有KVO不受支持的通知或其他可观察事件.即使文档说"不",观察CALayer支持UIView表面上也是安全的.观察CALayer在实践中是有效的,因为它广泛使用KVO和适当的访问器(而不是ivar操作).它不能保证继续工作.
无论如何,视图的框架只是其他属性的产物.因此我们需要观察那些:
[self.view addObserver:self forKeyPath:@"frame" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"bounds" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"transform" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"position" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"zPosition" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"anchorPoint" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"anchorPointZ" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"frame" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)
请参阅此处的完整示例 https://gist.github.com/hfossli/7234623
注意:据说文档不支持这个版本,但是到目前为止所有iOS版本都适用(目前iOS 2 - > iOS 11)
注意:请注意,在达到最终值之前,您将收到多个回调.例如,更改视图或图层的框架将导致图层更改position并bounds(按此顺序).
使用ReactiveCocoa,您可以做到
RACSignal *signal = [RACSignal merge:@[
RACObserve(view, frame),
RACObserve(view, layer.bounds),
RACObserve(view, layer.transform),
RACObserve(view, layer.position),
RACObserve(view, layer.zPosition),
RACObserve(view, layer.anchorPoint),
RACObserve(view, layer.anchorPointZ),
RACObserve(view, layer.frame),
]];
[signal subscribeNext:^(id x) {
NSLog(@"View probably changed its geometry");
}];
Run Code Online (Sandbox Code Playgroud)
如果您只想知道何时bounds可以进行更改
@weakify(view);
RACSignal *boundsChanged = [[signal map:^id(id value) {
@strongify(view);
return [NSValue valueWithCGRect:view.bounds];
}] distinctUntilChanged];
[boundsChanged subscribeNext:^(id ignore) {
NSLog(@"View bounds changed its geometry");
}];
Run Code Online (Sandbox Code Playgroud)
如果您只想知道何时frame可以进行更改
@weakify(view);
RACSignal *frameChanged = [[signal map:^id(id value) {
@strongify(view);
return [NSValue valueWithCGRect:view.frame];
}] distinctUntilChanged];
[frameChanged subscribeNext:^(id ignore) {
NSLog(@"View frame changed its geometry");
}];
Run Code Online (Sandbox Code Playgroud)
hfo*_*sli 62
编辑:我不认为这个解决方案足够彻底.这个答案是出于历史原因而保留的.请在此处查看我的最新答案:https://stackoverflow.com/a/19687115/202451
你必须在frame-property上做KVO.在这种情况下,"self"是一个UIViewController.
添加观察者(通常在viewDidLoad中完成):
[self addObserver:self forKeyPath:@"view.frame" options:NSKeyValueObservingOptionOld context:NULL];
Run Code Online (Sandbox Code Playgroud)
删除观察者(通常在dealloc或viewDidDisappear :)中完成:
[self removeObserver:self forKeyPath:@"view.frame"];
Run Code Online (Sandbox Code Playgroud)
获取有关更改的信息
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"view.frame"]) {
CGRect oldFrame = CGRectNull;
CGRect newFrame = CGRectNull;
if([change objectForKey:@"old"] != [NSNull null]) {
oldFrame = [[change objectForKey:@"old"] CGRectValue];
}
if([object valueForKeyPath:keyPath] != [NSNull null]) {
newFrame = [[object valueForKeyPath:keyPath] CGRectValue];
}
}
}
?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59387 次 |
| 最近记录: |