iPhone SDK - UIButton не работает в пользовательском представлении - PullRequest
2 голосов
/ 25 августа 2010

Это сводит меня с ума ... Я видел несколько постов по похожим вопросам, но, похоже, не могу заставить его работать, вот оно:

это очень простой пример, яя просто создаю пользовательский UIButton в пользовательском представлении, а затем назначаю ему пользовательское действие для реагирования на сенсорные события.Когда я запускаю приложение, кнопка создается, но при попытке щелкнуть по ней ничего не происходит.

Вот код моего пользовательского класса:

#import "MySegmentedControl.h"


@implementation MySegmentedControl
@synthesize button1;

- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {


    CGFloat a = frame.origin.x+5;
    CGFloat b = frame.origin.y+5;
    CGFloat l = frame.size.width-15;
    CGFloat h = frame.size.height-15;

    CGFloat c = a+l;
    CGFloat d = b;

    CGRect frame2 = CGRectMake(a, b, l, h);


    UIButton *mybutton1 = [UIButton buttonWithType:UIButtonTypeCustom];
    mybutton1.frame = frame2;
    [mybutton1 setTitle:@"TEST" forState:UIControlStateNormal];
    mybutton1.titleLabel.textColor = [UIColor blackColor];
    mybutton1.backgroundColor = [UIColor blueColor];

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

    [self setButton1:mybutton1];

    self.userInteractionEnabled = YES;
    button1.userInteractionEnabled = YES;

    [self addSubview:button1];

    [self bringSubviewToFront:button1];


}

return self;
}

-(void)action {

    [button1 setTitle:@"done" forState:UIControlStateNormal];
    button1.backgroundColor = [UIColor greenColor];
    NSLog(@"Working!");

}

А вот appDelegate:

#import "MySegmentedControlAppDelegate.h"
#import "MySegmentedControl.h"

@implementation MySegmentedControlAppDelegate

@synthesize window;


#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    [window makeKeyAndVisible];

    MySegmentedControl *mycontrol = [[MySegmentedControl alloc] initWithFrame:CGRectMake(10,50,135,50)];

    [window addSubview:mycontrol];

    return YES;
}

Как вы можете видеть из пользовательского класса, из того, что я читал в других постах, я попытался добавить несколько вещей, чтобы увеличить свои шансы на успех:

  • включение пользовательского взаимодействия с пользовательским представлением
  • вывод UIButton на передний план
  • , обеспечивающий полное включение рамки кнопки в рамку вида
  • ...

... но он все еще не работает! ...

Любая помощь будет принята с благодарностью - спасибо!

Редактировать: здесь также есть заголовок для пользовательскихпросмотр:

#import <UIKit/UIKit.h>


@interface MySegmentedControl : UIView {

    UIButton *button1;
}

@property (nonatomic, retain) IBOutlet UIButton *button1;

- (void)action;

@end

1 Ответ

3 голосов
/ 26 августа 2010

Можете ли вы присоединить файл заголовка своего пользовательского представления тоже?

(Извините, что делаю это в ответ, на данный момент у меня недостаточно репутации).

Редактировать (и реальный ответ):

Я создал проект, похожий на ваш, и думаю, что нашел проблему.

Ваш кадр кнопки не в порядке. Посмотрите на этот скриншот из симулятора, пользовательский кадр UIView выделен красным (просто добавьте self.backgroundColor=[UIColor redColor]; в свой конструктор представления):

alt text

Используя этот код:

CGFloat a = frame.origin.x+5;
CGFloat b = frame.origin.y+5;
CGFloat l = frame.size.width-15;
CGFloat h = frame.size.height-15;

Вы ссылаетесь на кадр в базовых координатах окна! Таким образом, ваша кнопка находится за пределами вашего обзора, и она не может обрабатывать сенсорные события.

Если вы хотите разместить свою кнопку динамически, вы должны использовать это:

CGFloat a = self.bounds.origin.x+5;
CGFloat b = self.bounds.origin.y+5;
GFloat l = self.bounds.size.width-15;
CGFloat h = self.bounds.size.height-15;

Используя self.bounds, вы используете базовую координату вида, и она работает (см. Скриншоты ниже)!

alt text alt text

Надеюсь, это поможет!

...