首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现自定义UIDynamicBehavior操作

如何实现自定义UIDynamicBehavior操作
EN

Stack Overflow用户
提问于 2014-01-11 04:37:36
回答 1查看 1.4K关注 0票数 4

我一直在寻找一个示例,演示如何在UIDynamicBehavior动态环境中实现自定义的UIKit。所有的教程和示例都只展示了如何使用原语(碰撞、重力、附着、推、扣等)组装UIDynamicBehavior。

在我的应用程序中,一些视图在屏幕上浮动(使用动态),当它们与其他静止视图重叠时,我想让它们消失。为此,我想测试UIDynamicAnimator和UICollisionBehavior委托方法中的重叠,但不幸的是,这些方法没有提供足够的粒度来执行我需要的测试。

编辑:显然,我必须等待一天才能回答我自己的问题(新用户),所以我的解决方案现在作为答案发布在下面。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-12 03:25:27

我选择的方法是开发我自己的UIDynamicBehavior类并将它添加到动画中,现在它使浮动视图在它们重叠静态视图时消失。

下面的示例代码展示了如何编写自己的UIDynamicBehavior类来将自己的行为插入到UIDynamicAnimator中。我调用了类UISinkBehavior,因为当视图在“陷坑”上移动时,它会“下沉”一个视图。

代码语言:javascript
复制
// UISinkBehavior.h
#import <UIKit/UIKit.h>

@protocol UISinkBehaviorDelegate <NSObject>
- (void)sunk:(id)item;
@end

@interface UISinkBehavior : UIDynamicBehavior
@property (weak, nonatomic) id<UISinkBehaviorDelegate> delegate;
- (id)initWithItems:(NSMutableArray*)items withSinkhole:(UIView*)sinkhole;
@end

// UISinkBehavior.m
#import "UISinkBehavior.h"

@interface UISinkBehavior ()
@property (nonatomic) NSMutableArray *items;
@property (nonatomic) id<UIDynamicItem> sinkhole;
@end

@implementation UISinkBehavior

- (id)initWithItems:(NSMutableArray*)items withSinkhole:(UIView*)sinkhole
{
    if (self = [super init])
    {
        _items = items;
        _sinkhole = sinkhole;
        // weak self ref to avoids compiler warning about retain cycles
        __weak typeof(self) ref = self;
        // this is called by the UIDynamicAnimator on every tick
        self.action = ^{
            UIView *item;
            // check each item if it overlaps sinkhole
            for (item in ref.items)
                if (CGRectIntersectsRect(item.frame, sinkhole.frame))
                {
                    // sink it (handled by delegate
                    [ref.delegate sunk:item];
                    // remove item from animation
                    [ref.items removeObject:item];
                    // remove behaviour from animator when last item sunk
                    if (ref.items.count < 1)
                        [ref.dynamicAnimator removeBehavior:ref];
                }
        };
    }    
    return self;
}
@end
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21058595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档