0

我在自定义 UISwitch DCRoundSwitch 的选择器方法中完成了以下动画代码。

if ([[[App.remindersArray objectAtIndex:0] objectAtIndex:3]isEqualToString:@"YES"]){

    [firstReminderOnOffButton setSelected:YES];
    [swtchDailyReminder setOn:YES];

    imgviewDailyReminder.image=[UIImage imageNamed:@"nDailyReminder_On_1.png"];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
    [UIView setAnimationDidStopSelector:@selector(animateFadingIn)];
    [UIView setAnimationDelegate:self];
     imgviewDailyReminderAnimation.alpha = 1.0;
    [UIView commitAnimations];

}
else
{

    [firstReminderOnOffButton setSelected:NO];
    [swtchDailyReminder setOn:NO];

    imgviewDailyReminder.image=[UIImage imageNamed:@"xDailyReminder_OFF.png"];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
    [UIView setAnimationDidStopSelector:@selector(animateFadingIn)];
    [UIView setAnimationDelegate:self];
    imgviewDailyReminderAnimation.alpha = 0.0;
    [UIView commitAnimations];

 }

问题是从普通 UISwitch 调用上述代码时动画可以正常工作,但从 DCRoundSwitch 调用时无法正常工作。

还尝试通过使用 UIView 块动画来解决....但仍然面临问题。

请指导我。

4

2 回答 2

1

问题出在DCRoundSwitch's动画块中。否CATransaction在完成块中创建,setOn:animated:ignoreControlEvents:导致[UIView animateWithDuration...]方法在响应开关值更改时无法正常工作。

要解决问题,只需更改:

if (previousOn != on && !ignoreControlEvents)
[self sendActionsForControlEvents:UIControlEventValueChanged];

至:

if (previousOn != on && !ignoreControlEvents)
{
[CATransaction begin];
[CATransaction setDisableActions:NO];
[self sendActionsForControlEvents:UIControlEventValueChanged];
[CATransaction commit];
}

应该这样做

于 2012-12-28T03:45:13.667 回答
0

我在下面的代码中使用了这个。哪个工作正常。

请关注这个话题

https://github.com/domesticcatsoftware/DCRoundSwitch/issues/12

你可以去使用这个 DCRoundSwitch 的类,在那个类的 dealloc 方法上放这条线。

 - (void)dealloc
 {
      [self.MyDCRoundSwitch removeTarget:nil
                         action:NULL
                         forControlEvents:UIControlEventAllEvents];
      [super dealloc];
 }
于 2013-03-22T13:45:56.210 回答