我的 UIImage 在放置在委托函数中时不会下降到屏幕底部



我的代码将一个UIImage放到屏幕底部。但它不工作,当我把相同的代码在isMyUIViewControllerDelegateTriggered。这是同一条线,不是吗?

MyUIViewController.m

@interface MyUIViewController () <UIDynamicAnimatorDelegate>
@property (strong, nonatomic) UIDynamicAnimator *animator;
@property (strong, nonatomic) DropitBehavior *dropitBehavior;
@property (strong, nonatomic) IBOutlet UIView *jobLoadView;
@end
@synthesize someUIImage;
id refToSelf;  /* Tried this to have a ref to the UIView, but doesn't work. */
static DropitBehavior * dropit;
- (void)viewDidLoad
{
    refToSelf = self;
    dropit = [[DropitBehavior alloc] init];
    /* Placed inhere, this code works!
    DropitBehavior * dropit = [refToSelf dropitBehavior];
    [dropit addItem:someUIImage]; */
    startupManager = [[StartupManager alloc] init];
    [startupManager setDelegate:refToSelf];
    [startupManager start];
}
- (DropitBehavior *)dropitBehavior
{
    if (!_dropitBehavior) {
        _dropitBehavior = [[DropitBehavior alloc] init];
        [self.animator addBehavior:_dropitBehavior];
    }
    return _dropitBehavior;
}
- (UIDynamicAnimator *)animator
{
    if (!_animator) {
        _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.jobLoadView];
        _animator.delegate = self;
    }
    return _animator;
}

-(void)isStartupManagerDelegateTriggered:(NSString *) errorcode {        
    /* The startup manager code triggers 5 time, so I can make a loading effect. */
    /* Doesn't work when I place the code inhere. */
    dropit = [refToSelf dropitBehavior];
    if ([dropit isKindOfClass:[DropitBehavior class]]) {
       NSLog(@"is kind of class drop it ");
       [dropit addItem:someUIImage];
    }
}

DropitBehavior.m

@interface DropitBehavior()
@property (strong, nonatomic) UIGravityBehavior *gravity;
@property (strong, nonatomic) UICollisionBehavior *collider;
@end
@implementation DropitBehavior
/* Singleton */
static DropitBehavior *sharedSingleton;
+ (void)initialize {
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        sharedSingleton = [[DropitBehavior alloc] init];
    }
}
- (UIGravityBehavior *)gravity
{
    if (!_gravity) {
        _gravity = [[UIGravityBehavior alloc] init];
        _gravity.magnitude = 0.9;
    }
    return _gravity;
}
- (UICollisionBehavior *)collider
{
    if (!_collider) {
        _collider = [[UICollisionBehavior alloc] init];
        _collider.translatesReferenceBoundsIntoBoundary = YES;
    }
    return _collider;
}
- (void)addItem:(id <UIDynamicItem>)item
{
    [self.gravity addItem:item];
    [self.collider addItem:item];
}
- (instancetype)init
{
    self = [super init];
    [self addChildBehavior:self.gravity];
    [self addChildBehavior:self.collider];
    return self;
}
@end

StartupManager.m

@implementation StartupManager
JSONParser * jsonParser;
HTTPConnection * httpConnection;
static StartupManager *sharedSingleton;
@synthesize delegate;
+ (void)initialize {
    static BOOL initialized = NO;
    if(!initialized) {
        initialized = YES;
        sharedSingleton = [[StartupManager alloc] init];
        jsonParser = [[JSONParser alloc] init];
        httpConnection = [[HTTPConnection alloc] init];
    }
}
- (void) doingSomeStuff {
        [httpConnection setDelegate:self];
        [httpConnection postRequestToSomeServer:@"some.instance.inthe.cloud";
}
-(void)isHTTPConnectionDelegateTriggered:(NSData *)jsonPost {
    [jsonParser setDelegate:self];
    [jsonParser parseJSON:jsonPost];
}
-(void)isJSONParserDelegateTriggered:(NSString *) message {
    */ this gets called periodically and that has to do a loading screen animation. /*
    [delegate isStartupManagerDelegateTriggered:message];
}

StartupManager.h

@class StartupManager;
@protocol StartupManagerDelegate
@required
    -(void)isStartupManagerDelegateTriggered:(NSString *) errorcode;
@end
@interface StartupManager : NSObject <JSONParserDelegate, HTTPConnectionDelegate>
@property (nonatomic, assign) id<StartupManagerDelegate>  delegate;
- (void) doingSomeStuff;
有没有人能给我指个正确的方向?否则我得去问爷爷。

我想你可能误解了uiddynamicanimatordelegate协议。它不会为你启动动画,它只是让你知道动画状态已经改变。

所以你通常不会从委托方法开始动画。在任何情况下,您发布的代码都没有实现任何委托方法。用上述代码启动动画的唯一方法是显式调用isMyUIViewControllerDelegateTriggered

你想什么时候开始?viewDidLoad太早了。viewDidAppear通常是你希望用户看到的东西的最早合理时间。

最新更新