1

我有一个非常小的动画,我想通过使用块(而不是动画标题)移动视图的框架来完成。

我的视图层次结构非常大,所以我将解释我想要动画的特定视图的所有内容。

最大的视图是占据整个屏幕的视图,因此它是 320x480 点。在这个视图中,我有另一个名为“keypadContainerView”的视图,它是 320x200 点,位于 0, 261,它出现在屏幕底部。这个keypadContainerView 有一个叫做keypadView 的子视图,它有一堆小按钮作为子视图。

最大视图 -> KeypadContainerView -> keypadView -> UIbuttons。

截图:

在此处输入图像描述

虽然这不言而喻,那里的键盘是 keypadContainerView,而不是 keypadView 和按钮。我需要这种层次结构,因为我的目标是在这里吸引眼球,并且每一层都有不同的背景。

我创建和处理该视图的方式在这里:

    keypadViewContainer = [[[UIView alloc] initWithFrame:CGRectMake(0, 261, 320, 200)] autorelease]; //(Original is 0, 261, 320, 200)
    keypadView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
    [keypadViewContainer addSubview:keypadView];

//Add the buttons

[self.view addSubview:keypadViewContainer];

这就是我试图为它制作动画的方式:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:5.0 animations:^{
        self.keypadViewContainer.frame = CGRectMake(0, 0, 320, 200);
    } completion:NULL];
}

有趣的是,如果我 NSLog 动画中的某些内容:参数,我实际上会得到一些输出,所以该方法肯定会被调用。它根本没有动画任何东西。

完整的控制器代码在这里,如果你需要它:

//UnlockKeyboardViewController
//------------------------------------------------------------------------
@interface UnlockKeyboardViewController : UIViewController
{
    NSArray *buttons;
    NSArray *passcodeFields;

    UIImage *buttonBackgroundImage;
    UIImage *buttonBackgroundHighlightedImage;
    UIImage *middleButtonBackgroundImage;
    UIImage *middleButtonBackgroundImageHighlighted;
    UIImage *screenBackgroundImage;

    UIImage *infoViewContainerImage;
    UIImage *keypadViewContainerImage;
    UIImage *passcodeFieldsContainerImage;

    UIImage *infoViewImage;
    UIImage *passcodeViewImage;

    UIView *infoViewContainer;
    UIView *keypadViewContainer;
    UIView *passcodeFieldsContainer;

    UIView *infoView;
    UIView *keypadView;
    UIView *passcodeFieldsView;

    UIView *infoToDisplayView; //The view the programmer passes to show in infoView.
}

@property(nonatomic, retain)UIImage *buttonBackgroundImage;
@property(nonatomic, retain)UIImage *buttonBackgroundHighlightedImage;
@property(nonatomic, retain)UIImage *screenBackgroundImage;
@property(nonatomic, retain)UIImage *keypadViewBackgroundImage;
@property(nonatomic, retain)UIImage *infoViewContainerImage;
@property(nonatomic, retain)UIImage *keypadViewContainerImage;
@property(nonatomic, retain)UIImage *passcodeFieldsContainerImage;
@property(nonatomic, retain)UIImage *infoViewImage;
@property(nonatomic, retain)UIImage *passcodeViewImage;
@property(nonatomic, retain)UIView *infoToDisplayView;

//Properties for container views.
@property(nonatomic, retain)UIView *infoViewContainer;
@property(nonatomic, retain)UIView *keypadViewContainer;
@property(nonatomic, retain)UIView *passcodeFieldsContainer;
@end

@implementation UnlockKeyboardViewController
@synthesize buttonBackgroundImage = _buttonBackgroundImage;
@synthesize buttonBackgroundHighlightedImage = _buttonBackgroundHighlightedImage;
@synthesize screenBackgroundImage = _screenBackgroundImage;
@synthesize keypadViewBackgroundImage = _keypadViewBackgroundImage;
@synthesize infoViewContainerImage = _infoViewContainerImage;
@synthesize keypadViewContainerImage = _keypadViewContainerImage;
@synthesize passcodeFieldsContainerImage = _passcodeFieldsContainerImage;
@synthesize infoViewImage = _infoViewImage;
@synthesize passcodeViewImage = _passcodeViewImage;
@synthesize infoToDisplayView = _infoToDisplayView;

//Synthesizers for container views.
@synthesize infoViewContainer = _infoViewContainer;
@synthesize keypadViewContainer = _keypadViewContainer;
@synthesize passcodeFieldsContainer = _passcodeFieldsContainer;

-(void)loadView
{
    [super loadView];
    self.view.frame = CGRectMake(0, 0, 320, 480);
    _unlockKeyboardBundle = [NSBundle bundleForClass:[self class]];
    buttonBackgroundImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"button" ofType:@"png"]];
    middleButtonBackgroundImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"middleButton" ofType:@"png"]];
    buttonBackgroundHighlightedImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"pushedButton" ofType:@"png"]];
    middleButtonBackgroundImageHighlighted = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"pushedButtonMiddle" ofType:@"png"]];

    infoViewContainerImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"infoViewContainerImage" ofType:@"png"]];
    keypadViewContainerImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"keypadViewContainerImage" ofType:@"png"]];
    passcodeFieldsContainerImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"passcodeViewContainerImage" ofType:@"png"]];

    infoViewImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"infobackground" ofType:@"png"]];
    passcodeViewImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"passcodescreen" ofType:@"png"]];

    //self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"lockbackground" ofType:@"png"]]];

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    keypadViewContainer = [[[UIView alloc] initWithFrame:CGRectMake(0, 261, 320, 200)] autorelease]; //(Original is 0, 261, 320, 200)
    keypadView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
    [keypadViewContainer addSubview:keypadView];
    keypadViewContainer.backgroundColor = [UIColor colorWithPatternImage:keypadViewContainerImage];

    NSMutableArray *tempButtons = [NSMutableArray array];
    self.view.opaque = YES;

    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button1 setTitle:@"1" forState:UIControlStateNormal];
    button1.frame = CGRectMake(0, 0, 106, 50);

    UIButton *button4 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button4 setTitle:@"4" forState:UIControlStateNormal];
    button4.frame = CGRectMake(0, 50, 106, 50);

    UIButton *button7 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button7 setTitle:@"7" forState:UIControlStateNormal];
    button7.frame = CGRectMake(0, 100, 106, 50);

    UIButton *cancel = [UIButton buttonWithType:UIButtonTypeCustom];
    [cancel setTitle:NSLocalizedString(@"cancel", @"Cancel string") forState:UIControlStateNormal];
    cancel.frame = CGRectMake(0, 150, 106, 50);

    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button2 setTitle:@"2" forState:UIControlStateNormal];
    button2.frame = CGRectMake(106, 0, 108, 50);

    UIButton *button5 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button5 setTitle:@"5" forState:UIControlStateNormal];
    button5.frame = CGRectMake(106, 50, 108, 50);

    UIButton *button8 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button8 setTitle:@"8" forState:UIControlStateNormal];
    button8.frame = CGRectMake(106, 100, 108, 50);

    UIButton *button0 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button0 setTitle:@"0" forState:UIControlStateNormal];
    button0.frame = CGRectMake(106, 150, 108, 50);

    UIButton *button3 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button3 setTitle:@"3" forState:UIControlStateNormal];
    button3.frame = CGRectMake(214, 0, 106, 50);

    UIButton *button6 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button6 setTitle:@"6" forState:UIControlStateNormal];
    button6.frame = CGRectMake(214, 50, 106, 50);

    UIButton *button9 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button9 setTitle:@"9" forState:UIControlStateNormal];
    button9.frame = CGRectMake(214, 100, 106, 50);

    UIButton *cancelOrDelete = [UIButton buttonWithType:UIButtonTypeCustom];
    [cancelOrDelete setTitle:@"<-" forState:UIControlStateNormal];
    cancelOrDelete.frame = CGRectMake(214, 150, 108, 50);

    [tempButtons addObject:button1];
    [tempButtons addObject:button2];
    [tempButtons addObject:button3];
    [tempButtons addObject:button4];
    [tempButtons addObject:button5];
    [tempButtons addObject:button6];
    [tempButtons addObject:button7];
    [tempButtons addObject:button8];
    [tempButtons addObject:button9];
    [tempButtons addObject:button0];
    [tempButtons addObject:cancel];
    [tempButtons addObject:cancelOrDelete];

    buttons = [[NSArray arrayWithArray:tempButtons] retain];

    for(UIButton *theButton in buttons)
    {
        if([theButton.currentTitle isEqualToString:@"2"] || [theButton.currentTitle isEqualToString:@"5"] || [theButton.currentTitle isEqualToString:@"8"] || [theButton.currentTitle isEqualToString:@"0"])
        {
            [theButton setBackgroundImage:middleButtonBackgroundImage forState:UIControlStateNormal];
            [theButton setBackgroundImage:middleButtonBackgroundImageHighlighted forState:UIControlStateHighlighted];
        }else
        {
            [theButton setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal];
            [theButton setBackgroundImage:middleButtonBackgroundImageHighlighted forState:UIControlStateHighlighted];
        }
        [keypadView addSubview:theButton];
    }
    [self.view addSubview:keypadViewContainer];

    passcodeFieldsView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0,320, 110)] autorelease];
    passcodeFieldsContainer = [[[UIView alloc] initWithFrame:CGRectMake(0, 151, 320, 110)] autorelease];
    passcodeFieldsContainer.backgroundColor = [UIColor colorWithPatternImage:passcodeFieldsContainerImage];
    passcodeFieldsView.backgroundColor = [UIColor colorWithPatternImage:passcodeViewImage];

    NSMutableArray *passTemps = [NSMutableArray array];

    UITextField *tf1 = [[[UITextField alloc] initWithFrame:CGRectMake(24, 27, 50, 50)] autorelease];
    UITextField *tf2 = [[[UITextField alloc] initWithFrame:CGRectMake(98, 27, 50, 50)] autorelease];
    UITextField *tf3 = [[[UITextField alloc] initWithFrame:CGRectMake(172, 27, 50, 50)] autorelease];
    UITextField *tf4 = [[[UITextField alloc] initWithFrame:CGRectMake(246, 27, 50, 50)] autorelease];

    [passTemps addObject:tf1];
    [passTemps addObject:tf2];
    [passTemps addObject:tf3];
    [passTemps addObject:tf4];

    passcodeFields = [[NSArray arrayWithArray:passTemps] retain];

    for(UITextField *theTf in passcodeFields)
    {
        theTf.borderStyle = UITextBorderStyleBezel;
        theTf.backgroundColor = [UIColor whiteColor];
        theTf.enabled = NO;
        theTf.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        theTf.textAlignment = UITextAlignmentCenter;
        theTf.adjustsFontSizeToFitWidth = YES;
        theTf.alpha = 0.7;
        theTf.secureTextEntry = YES;
        [passcodeFieldsView addSubview:theTf];
    }

    [passcodeFieldsContainer addSubview:passcodeFieldsView];

    [self.view addSubview:passcodeFieldsContainer];

    infoView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 151)] autorelease];
    infoView.backgroundColor = [UIColor colorWithPatternImage:infoViewImage];
    infoViewContainer = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 151)] autorelease];
    infoViewContainer.backgroundColor = [UIColor colorWithPatternImage:infoViewContainerImage];

    [infoViewContainer addSubview:infoView];

    [self.view addSubview:infoViewContainer];

    [pool drain];
}
-(void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:5.0 animations:^{
        self.keypadViewContainer.frame = CGRectMake(0, 0, 320, 200);
    } completion:NULL];
}

-(void)dealloc
{
    [buttons release];
    [passcodeFields release];
    [buttonBackgroundImage release];
    [buttonBackgroundHighlightedImage release];
    [screenBackgroundImage release];
    [infoView release];
    [keypadView release];
    [passcodeFieldsView release];
    [infoViewContainerImage release];
    [keypadViewContainerImage release];
    [passcodeFieldsContainerImage release];
    [infoViewImage release];
    [passcodeViewImage release];
    [infoToDisplayView release];
    [super dealloc];
}
@end

我有一种小小的感觉,这可能与我处理观点的方式有关,所以这里有完整的源代码。

对此的任何帮助将不胜感激。

4

1 回答 1

1

而不是那些:

keypadViewContainer = [[[UIView alloc] initWithFrame:CGRectMake(0, 261, 320, 200)] autorelease]; 

采用

Self.keypadViewContainer = .....

你的@synthesize 是错误的。您显式声明 iVar,不带下划线,但使用 synthesize 创建带下划线的 iVar。

所以你的属性对应于 _keypadViewContainer 但在你的 loadView 中你分配给 keypadViewController

最快的解决方法:只需使用 @synthesize 而不是 synthesize = ... (仅当您不使用 Xcode 4.4 时!)

最佳解决方案:摆脱显式 iVar 声明,并确保在您像在 dealloc 中一样直接访问 iVar 时使用 _keypadViewContainer 等。

理想的解决方法:使用 ARC 并使用 IB 来构建您的键盘界面(顺便说一句,您为什么不呢?)

于 2012-07-29T21:40:35.470 回答