Почему кнопки UIB не обнаруживают касание в UIView на UIActionSheet? - PullRequest
0 голосов
/ 17 марта 2012

Я добавил UIView (который содержит UIImageView для фона, три кнопки UIB с надписью «Test» и конечную кнопку UIB для отклонения представления под названием «Finished») как подпредставление моего UIActionSheet.* Почему любая из этих кнопок не обнаруживает прикосновения?В моем UIView проверено взаимодействие с пользователем.

Буду признателен за помощь, поскольку я выдергиваю свои волосы (не буквально, конечно)!

Вот мои настройки:

enter image description here

Ответы [ 2 ]

2 голосов
/ 17 марта 2012

Если вы просто имитируете UIActionSheet, я просто создал бы подкласс UIVew, который называется что-то вроде «CoolActionSheet», и программно разместил там кнопки. Затем, когда вы нажимаете кнопки, это вызывает метод делегата в протоколе, который будет реализован в вашем контроллере основного вида, поэтому сделайте что-нибудь.

Чтобы показать и скрыть средство выбора действий, используйте анимации UIView в классе CoolActionSheet , например:

-(void)showSheet {
    NSLog(@"Showing sheet...");
    //Set the x/y position of the action sheet to JUST off-screen
    CGFloat xPos = parentView.frame.origin.x;
    CGFloat yPos = parentView.frame.size.height+kActionSheetHeight;

    [self setFrame:CGRectMake(xPos, yPos, kActionSheetWidth, kActionSheetHeight)];

    /*Here is where you would add your other UI objects such as buttons 
    and set their @selector to a method in your CoolActionSheet protocol. You could then implement this delegate method in 
    your main view controller to carry out a custom action. You might also want to add a background image to the view or something else.
    For example: */
    UIButton *coolButton = [[UIButton alloc] initWithFrame:buttonDimensions];
    [coolButton addTarget:self action:@selector(didDismissActionSheet) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:coolButton];

    [self.parentView addSubview:self.view];

    //Slide the sheet up from the bottom of the screen
    [UIView animateWithDuration:0.2 animations:^(void) {
        //Slide banner in from left to right
        [self setFrame:CGRectMake(0, yPos-kActionSheetHeight, kActionSheetWidth, kActionSheetHeight)];
    }];
}

И скрыть:

-(void)hideSheet {
    NSLog(@"Hiding");
    CGFloat xPos = parentView.frame.origin.x;
    CGFloat yPos = parentView.frame.size.height+kActionSheetHeight;

    [UIView animateWithDuration:0.2 animations:^(void) {
        [self setFrame:CGRectMake(xPos, yPos, 320, 65)];
    }completion:^(BOOL finished) {
        [self removeFromSuperview]; //Clean up
    }];
}

Возможно, вы также захотите выделить родительский вид серым цветом. Опять же, в CoolActionSheet.m:

-(void)shadeParentView {
    UIView *shadedView = [[UIView alloc] initWithFrame:CGRectMake(, 0, 320, 480)];

    [shadedView addGestureRecognizer:gestureRecognizer];
    [shadedView setBackgroundColor:[UIColor blackColor]];
    [shadedView setAlpha:0.0];

    [self addSubview:shadedView];

    [UIView animateWithDuration:0.5 animations:^{
        [shadedView setAlpha:0.5];
    }];

}

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

CoolActionSheet *coolSheet = [[CoolActionSheet alloc] init];
[coolSheet setParentView:self.view];
[coolSheet setSheetDelegate:self]; //set the delegate to implement button press methods in this view controller

Это может показаться немного скучным, но это хороший шаблон MVC, чтобы разделить его на другой класс представления, подобный этому. И теперь у вас есть собственный класс, который вы можете просто импортировать в любой другой проект, и он будет работать!

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

  • Использовать пользовательский класс UIView
  • Реализуйте методы делегата для выполнения задач в вашем главном контроллере представления, когда кнопка нажата в вашем подпредставлении.
  • Реализация хорошей структуры MVC, чтобы избежать спагетти-кода.

Дайте мне знать, если это поможет:)

0 голосов
/ 17 марта 2012

Попробуйте:

[actionSheet showInView:self.view.window];
...