0

運が悪かったので、しばらくの間この答えを探していました。GoogleからStackOverflowへ。私がこれまでに見つけた唯一の答えは、単にinitではなく、ビューでinitWithFrameを呼び出すように人々に指示しています。UIViewsでのinitへのすべての呼び出しをinitWithFrameに置き換えましたが、うまくいきません。

私はIBを使用していません。

これが私のコード全体です:

@interface UnlockKeyboard : UIView
{
    NSArray *buttons;
    UITextField *passcodeFields;

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

    UIView *infoView;
    UIView *keypadView;
}
@property(nonatomic, retain)UIImage *buttonBackgroundImage;
@property(nonatomic, retain)UIImage *buttonBackgroundHighlightedImage;
@property(nonatomic, retain)UIImage *screenBackgroundImage;
@property(nonatomic, retain)UIImage* keypadViewBackgroundImage;

@end

@implementation UnlockKeyboard
@synthesize buttonBackgroundImage = _buttonBackgroundImage;
@synthesize buttonBackgroundHighlightedImage = _buttonBackgroundHighlightedImage;
@synthesize screenBackgroundImage = _screenBackgroundImage;
@synthesize keypadViewBackgroundImage = _keypadViewBackgroundImage;
-(id)init
{
    if((self = [super initWithFrame: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"]];
        keypadView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        NSMutableArray *tempButtons = [NSMutableArray array];
        //self.frame = CGRectMake(320, 480, 0, 0);
        self.backgroundColor = [UIColor lightGrayColor];
        self.opaque = YES;

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

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

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

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

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

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

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

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

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

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

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

        UIButton *cancelOrDelete = [UIButton buttonWithType:UIButtonTypeCustom];
        [cancelOrDelete setTitle:@"<-" forState:UIControlStateNormal];
        cancelOrDelete.frame = CGRectMake(214, 411, 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:hint];
        [tempButtons addObject:cancelOrDelete];

        for(UIButton *theButton in tempButtons)
        {
            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 addSubview:keypadView];

        [pool drain];
    }
    return self;
}
-(void)dealloc
{
    [buttons release];
    [passcodeFields release];
    [buttonBackgroundImage release];
    [buttonBackgroundHighlightedImage release];
    [screenBackgroundImage release];
    [infoView release];
    [keypadView release];
    [super dealloc];
}

ご覧のとおり、UnlockKeyboardを使用してUIViewをサブクラス化します。UnlockKeyboardには、すべてのUIButtonを含む別のサブビュー(keypadView)が必要です。したがって、すべてのkeyboardViewはUnlockKeyboardsのサブビューであり、これらのボタンはすべてkeyboardView内にある必要があります。うまく追加できますが、タップしても制御状態が変わりません。はい、ご覧のとおり、UIViewを作成するときに、initへのすべての呼び出しをinitWithFrameに置き換えました。

これに関するどんな助けも本当にありがたいです。

4

4 に答える 4

2

ボタンのターゲットを追加して、ボタンを押したときにどのメソッドを呼び出すかをボタンが認識できるようにする必要があります。それはこのように見えるでしょう

[button addTarget:self action:@selector(method) forControlEvents:UIControlEventTouchUpInside];

ここで、self はメソッドを含むインスタンスであり、method はボタンがクリックされたときに実行されるメソッドです。

これがうまくいくことを願っています

乾杯、

〜ジョン

于 2012-07-26T04:38:23.487 に答える
2

コントロール状態の背景画像ではなく、コントロール状態の画像を設定する必要があります。

[btn setImage: [UIImage imageNamed: @"image.png"] forState: UIControlStateNormal];

したがって、次のようになります。

[theButton setImage:middleButtonBackgroundImage forState:UIControlStateNormal];
            [theButton setBackgroundImage:middleButtonBackgroundImageHighlighted forState:UIControlStateHighlighted];
于 2012-07-26T04:40:44.413 に答える
1

ボタンにはターゲットやアクションが定義されていないため、ボタンは何をしたいのかわかりません。アクションがあった場合は、アクション メソッドを使用して送信者の状態を変更できます (送信者はボタンです)。

于 2012-07-26T04:38:37.067 に答える
0

理解した。keypadView に関してボタンフレームを設定していた方法は、完全にめちゃくちゃでした。ボタンをスーパービューに追加することを決めたときに、ボタンにフレーム変更を加えるのを忘れていたため、ボタンは正しく表示されましたが、タッチ イベントに関しては「座標が正しくありませんでした」。たとえば、実際のボタンは (3,4) にありましたが、タッチポイントは (10,20) にありました。

スーパービューでより適切に再生されるようにフレームを修正すると、問題が修正されました

于 2012-07-26T05:26:28.220 に答える