Если вы просто хотите имитировать 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