gpt4 book ai didi

ios - 检测 UIView 在另一个 UIView 中的移动

转载 作者:行者123 更新时间:2023-12-01 19:17:23 24 4
gpt4 key购买 nike

我有什么:

当我移动 UIView我通过执行以下操作来检测它的运动:

[myView.layer addObserver:self forKeyPath:@"position" options:NSKeyValueObservingOptionNew context:nil];

正在 myView UIView我要搬家了 self一个类,我必须检测 UIView 的不同位置拥有。

问题:

当我把 myView在另一个 UIView我移动了 anotherView :
[anotherView addSubview: myView];

方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

不再被调用,虽然理论上 myView也在移动。我尝试使用 NSNotification每次发生“运动”时都会被解雇,但我觉得它很笨拙。这类问题有“优雅”的解决方案吗?

对于 UIView的运动我正在使用这种方法:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

最佳答案

我在这里上传了一个示例项目,它可以干净地做到这一点:

https://github.com/n9986/ObservingUIViewMovement

我曾经有过类似的要求。这里的问题是,当您将 UIView 添加到另一个 UIView(称为 superView)时,它现在驻留在 superView 的坐标空间中。因此,superView 在其父坐标空间中的移动不会影响其 subview 。

我将在这里稍微解释一下代码。

我们有ViewController , MyViewInsideView类说明您的典型类。我想在 viewController 中观察 InsideView 是否移动了。所以在自定义类中,我添加了一个属性positionInWindow并在 superView 移动时更新它。

所以在 InsideView.m :

// Make sure this property exists in .h file to make the class KVC compliant
@synthesize positionInWindow;

// This method is called when the super view changes.
- (void)didMoveToSuperview
{
// Drop a random log message
NSLog(@"MAI SUPERVIEW HAS CHANGED!!!");

// Start observing superview's frame
[self addObserver:self
forKeyPath:@"superview.frame"
options: NSKeyValueObservingOptionNew
context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
// Here we update the positionInWindow because
// we know the superView.frame has changed
CGPoint frameOrigin = self.frame.origin;
[self setPositionInWindow:[[self window] convertPoint:frameOrigin
fromView:self]];
}

以及您想要监控此 View 的任何地方:
// On an instance of InsideView
[insideView addObserver:self
forKeyPath:@"positionInWindow"
options:NSKeyValueObservingOptionNew
context:nil];

这个解决方案的好处是 InsideView不需要知道是谁 superView .即使 superView后来改了。 MyView 没有修改类(class)。并且任何类都可以独立于该事实来监视它的属性。

关于ios - 检测 UIView 在另一个 UIView 中的移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12284121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com