Если вы просто имитируете 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, чтобы избежать спагетти-кода.
Дайте мне знать, если это поможет:)