Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:将观察者添加到UIView';s帧。原点。y?_Ios_Frame - Fatal编程技术网

iOS:将观察者添加到UIView';s帧。原点。y?

iOS:将观察者添加到UIView';s帧。原点。y?,ios,frame,Ios,Frame,我试图监视UIView帧原点的变化值并对其作出反应。 我的代码: 我收到了以下我不理解的错误消息: An instance 0x7587d10 of class NSConcreteValue was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some oth

我试图监视UIView帧原点的变化值并对其作出反应。 我的代码:

我收到了以下我不理解的错误消息:

An instance 0x7587d10 of class NSConcreteValue was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x7587fd0> (
<NSKeyValueObservance 0x7587f70: Observer: 0x7587bd0, Key path: origin, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x7587ff0>
)
NSConcreteValue类的实例0x7587d10在键值观察者仍向其注册时被释放。观测信息被泄露,甚至可能被错误地附加到其他物体上。在NSKVODeallocateBreak上设置断点,使其在调试器中停止。以下是当前的观察信息:
(
)
实际上,我只对原点的y位置感兴趣,但如果我将keyPath设置为“frame.origin.y”,代码甚至不会编译

如果我将keyPath设置为简单的“frame”,则不会出现错误,但不会调用observeValueForKeyPath方法。我猜对帧原点的更改不算对帧的更改


如何将观察者添加到UIView的frame.origin.y中?

我认为不可能只观察帧的y值。但是您可以覆盖setFrame:方法,而不是观察frame属性

像这样:

- (void)setFrame:(CGRect)frame 
{
    [super setFrame:frame]
    if (self.frame.origin.y != frame.origin.y){
         // Do your stuff here
    }
 }

虽然我不能以我最初想要的方式完全解决我的问题,但我发现我能够将观察者正确地添加到UIView的中心。 通过监视视图的中心,我可以确定帧的原点已更改

[cell.bottomView addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:NULL];
使用的方法非常简单,如下所示:

[RACObserve(self.view, frame) subscribeNext:^(NSNumber *rect) {
        NSLog(@"position y: %f", rect.CGRectValue.origin.y);
    }];

例如。

谢谢你的建议。我试过了,但这个方法似乎没有被调用。问题是,我正在使用autolayout,它会在某个点修改frame.origin.y(不确定确切的时间,但在容器视图点击didMoveToWindow时会修改)。您知道autolayout使用哪种方法修改帧吗?您不需要在
observer valueforkeypath:
中调用super。
[RACObserve(self.view, frame) subscribeNext:^(NSNumber *rect) {
        NSLog(@"position y: %f", rect.CGRectValue.origin.y);
    }];