- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
作为实现 UICollisionBehaviour 的一部分,我为屏幕边缘设置了边界。然后我添加了一些 View ,最后将 UIPanGestureRecognizer 附加到其中一个。
现在我可以使用可拖动 View 来插入较小的 View 。
问题:如果我将一个较小的 View 转角并继续将其推向屏幕边缘,它最终会滑过边界并被困在另一侧。我用来击打和插入其他 View 的“锤 subview ”也会陷入边界。 IE。它被卡在/不可拖动到屏幕的一侧。
我做了一个非常小的例子,看看当我只有很少的 View 并且没有冲突的行为时,我是否可以重现它, View 仍然穿过边界。要么 UIDynamics 不能处理太多,要么(更有可能)我以某种方式配置错误。
下面的小例子有奇怪的行为:
class ViewController: UIViewController {
var animator: UIDynamicAnimator?
var collisionBehaviour: UICollisionBehavior?
var panBehaviour: UIAttachmentBehavior?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
setup()
}
func setup() {
//setup collisionBehaviour and animator
collisionBehaviour = UICollisionBehavior()
collisionBehaviour!.collisionMode = UICollisionBehaviorMode.allZeros
animator = UIDynamicAnimator(referenceView: view)
//add boundaries
collisionBehaviour!.addBoundaryWithIdentifier("verticalMin", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(0, CGRectGetHeight(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("verticalMax", fromPoint: CGPointMake(CGRectGetMaxX(view.frame), 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetHeight(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("horizontalMin", fromPoint: CGPointMake(0, CGRectGetMaxY(view.frame)), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetMaxY(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("horizontalMax", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), 0))
// collisionBehaviour!.translatesReferenceBoundsIntoBoundary = true // same effect as the above boundaries
//setup up some round views to push around
for i in 0..<5 {
let ball = UIView(frame: CGRectMake(0, 30, 50, 50))
ball.center = view.center
ball.backgroundColor = UIColor.greenColor()
ball.layer.cornerRadius = CGRectGetWidth(ball.frame) * 0.5
view.addSubview(ball)
collisionBehaviour!.addItem(ball)
}
//setup a hammer view which can be dragged and used to squeze the ball views of the screen
let hammer = UIView(frame: CGRectMake(0, 0, 100, 100))
hammer.backgroundColor = UIColor.redColor()
view.addSubview(hammer)
collisionBehaviour!.addItem(hammer)
let noRotationBehaviour = UIDynamicItemBehavior(items: [hammer])
noRotationBehaviour.allowsRotation = false
animator!.addBehavior(noRotationBehaviour)
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:"))
hammer.addGestureRecognizer(panGestureRecognizer)
//"start" the collision detection
animator!.addBehavior(collisionBehaviour!)
}
//Move the hammer around
func handlePan(recognizer: UIPanGestureRecognizer) {
if let view = recognizer.view {
let location = recognizer.locationInView(self.view)
switch recognizer.state {
case .Began:
panBehaviour = UIAttachmentBehavior(item: view, attachedToAnchor: location)
animator!.addBehavior(panBehaviour!)
println("begin")
case .Changed:
panBehaviour!.anchorPoint = location
println("change \(location)")
case .Ended:
println("ended")
animator!.removeBehavior(panBehaviour!)
default:
println("done")
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
感谢您提供的任何帮助。
最佳答案
好消息:您没有做错任何事。坏消息:这是预期的行为。你的锤子将 View 推向引用边界,直到它最终突破,因为你的模型的物理学说它应该这样做。引用边界不是不能跨越的边界,它只是定义了你的物理规则始终适用的区域。
这并没有真正记录下来,但 UICollisionBehavior 的页面指出:
When setting the initial position for a dynamic item, you must ensure that its bounds do not intersect any collision boundaries. The animation behavior for such a misplaced item is undefined.
这只是部分正确,在您的情况下(与我的情况一样)如果项目在初始化后超出边界,它的行为也是未定义的。
我试图在 View 的右侧安排一组球。最右边的球下面有一个 anchor 。黄色 View 是引用 View ,一切都很好......
但是,当我添加更多球到它们不再适合时,它们会开始弹出。事实上,图像右上角的那个从底部中心弹出并逆时针围绕引用 View 滚动到 anchor 附近。
更新:对于解决方案,您可以设置 collisionBehaviors 的 collisionDelegate 并捕获碰撞的开始和结束,然后将您的 View 移回边界并远离您的锤子,使其看起来像是逃脱了。
如您所知,translatesReferenceBoundsIntoBoundary 等同于一组 addBoundaryWithIdentifier 调用。
使用:
collisionBehaviour!.translatesReferenceBoundsIntoBoundary = true
同于:
//add boundaries
collisionBehaviour!.addBoundaryWithIdentifier("verticalMin", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(0, CGRectGetHeight(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("verticalMax", fromPoint: CGPointMake(CGRectGetMaxX(view.frame), 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetHeight(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("horizontalMin", fromPoint: CGPointMake(0, CGRectGetMaxY(view.frame)), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetMaxY(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("horizontalMax", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), 0))
关于ios - UICollisionBehavior - View 穿过边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973250/
我正在尝试使用UIKit Dynamics的iOS iPhone应用程序进行物理动画处理。这是一场篮球比赛,您可以将球扔进篮筐。但是,我不知道如何使球变圆(UICollisionBehavior和UI
我的应用程序有一个自定义的 UIButton,它有两个 subview ,它们看起来像是被绳子挂起来了。当用户点击按钮时,一个会被拉回,然后与另一个发生碰撞。这在第一次碰撞时对我有用,但是当我第二次点
如果我定义一个开放的 UIBezierPath 并将其设置为碰撞边界: _containerPath = [UIBezierPath bezierPathWithArcCenter:center
我在导航 Controller 中有一个 View 。 然后我向该 View 添加一个 subview 并偏移其原点高度,使其仅覆盖屏幕的一半(另一半溢出屏幕底部)。然后我希望能够向上拖动此 View
我正在尝试弄清楚如何使用 UIKit Dynamics 成功地碰撞两个具有自定义边界形状的 UIView。 我能想到的最基本的例子来解释我的问题是让两个圆碰撞(考虑到它们的圆角)而不是它们的方形边界。
作为实现 UICollisionBehaviour 的一部分,我为屏幕边缘设置了边界。然后我添加了一些 View ,最后将 UIPanGestureRecognizer 附加到其中一个。 现在我可以使
在我的应用程序中,我目前正在绘制一个基本 View ,然后我尝试使用 CAShapeLayer 将它的角变圆,但 UICollisionBehavior 仍然像绘制的正方形一样使用react。 这是我
我想使用 UIKit Dynamics 组合 UIAttachmentBehavior 和 UICollisionBehavior,以便用户可以拖动 View (使用 UIPanGestureReco
我有一个 View ,其边界设置为碰撞( setTranslatesReferenceBoundsIntoBoundaryWithInsets )和一个带有重力的 subview 设置,以便它可以与
我正在做一个简单的动画,它需要我处理一些与边界的碰撞。 我有一个类 viewcontroller,我将其扩展为 UICollisionBehaviorDelegate,以便我可以识别和处理 View
我最近尝试使用 UIKitDynamics 创建一个类似乒乓球的小游戏。我成功地构建了核心游戏。现在我想添加一些额外的机制。 例如,一种行为会减小 Racket 的大小。我添加了一个执行此类操作的 N
是否可以更改 UIView 的边界(它使用 UIAttachmentBehaviors 附加到其他一些 UIView)并让 UICollisionBehavior 结合 UIAttachmentBeh
我目前正在为一个播放 connect 4 的框架设计一个 UI。这个框架封装在一个名为 GameSession 的类中。我不会描述它的 API 的来龙去脉以及它是如何运作的。我不相信这很重要。 我相信
我正在尝试在 UIKit Dynamics 中使用 UICollisionBehavior 来确定我何时将 View 抛出屏幕(使用 UIAttachmentBehavior 和 UIPushBeha
在我的应用程序中,我使用包含 UICollisionBehavior 的 UIKit Dynamics 使菜单在打开和关闭时弹跳。我为此使用的代码如下。这在 iOS8 上运行良好。然而,对于 iOS9
我是一名优秀的程序员,十分优秀!