2012-03-17 8 views
0

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

Почему не любые этих кнопок обнаруживают касания? Мой UIView активирован User Interaction Enabled.

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

Вот мой набор вверх:

enter image description here

+0

набор действий для этого кнопки, то вы можете делать все, что вы хотите, в том, что методы действий – Narayana

+0

я думаю, что это не возможно, потому что я уже пробовал, тот же вопрос пришел, тогда я положил навигационную панель с двумя кнопками и PickerView в листе действий.Если вы хотите представить полный просмотр, то мое предложение - использовать presentModelViewController. –

+0

Я просто хотел подражать анимации таблицы UIActionSheet, чтобы вызвать небольшой диалог внизу. Мне действительно не хотелось показывать полный размер. Есть ли способ сделать это? –

ответ

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

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

+1

Вот очень простой пример проекта: http://cl.ly/0Z2I3w1g461h16302C0c Надеюсь, это дает некоторую ясность. –

0

Попробуйте:

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

, к сожалению, не имело особого значения ... –

Смежные вопросы