Почему UIButtons не обнаруживает касание в UIView на UIActionSheet?

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

Почему ни одна из этих кнопок не распознает касания? В моем UIView установлен флажок User Interaction Enabled.

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

Вот моя установка:

введите описание изображения здесь


person objc-obsessive    schedule 17.03.2012    source источник
comment
установить действие для этих кнопок, тогда вы можете делать все, что хотите, в этих методах действия   -  person Narayana    schedule 17.03.2012
comment
Я думаю, что это невозможно, потому что я уже пробовал это, возникла такая же проблема, тогда я поместил панель навигации с двумя кнопками и PickerView в листе действий. Если вы хотите представить полный просмотр, я предлагаю использовать presentModelViewController.   -  person Khalid Usman    schedule 17.03.2012
comment
Я просто хотел имитировать анимацию UIActionSheet, чтобы внизу появился небольшой диалог. Я действительно не хотел, чтобы отображался полноразмерный вид. Есть ли еще способ сделать это?   -  person objc-obsessive    schedule 17.03.2012
comment
Можете ли вы опубликовать код для листа действий и кнопок?   -  person Dominik Hadl    schedule 17.03.2012


Ответы (2)


Если вы просто хотите имитировать 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, чтобы избежать спагетти-кода.

Позвольте мне знать, если это помогает :)

person Kiran Panesar    schedule 17.03.2012
comment
Вот очень простой пример проекта: cl.ly/0Z2I3w1g461h16302C0c Надеюсь, это внесет некоторую ясность. - person Kiran Panesar; 18.03.2012

Попробуй это:

[actionSheet showInView:self.view.window];
person Apple    schedule 17.03.2012