Я использовал подход Андрея на основе UISegmentedControl и немного его расширил, чтобы вести себя как обычный UIButton:
@interface SPWKBarButton : UISegmentedControl
- (id)initWithTitle:(NSString *)title;
- (void)setTitle:(NSString *)title;
@end
@implementation SPWKBarButton
- (id)initWithTitle:(NSString *)title
{
self = [super initWithItems:@[title]];
if (self) {
self.segmentedControlStyle = UISegmentedControlStyleBar;
NSDictionary *attributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor]
forKey:UITextAttributeTextColor];
[self setTitleTextAttributes:attributes
forState:UIControlStateNormal];
}
return self;
}
- (void)setTitle:(NSString *)title
{
[self setTitle:title forSegmentAtIndex:0];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
if (CGRectContainsPoint(self.bounds, [[touches anyObject] locationInView:self])) {
self.selectedSegmentIndex = 0;
} else {
self.selectedSegmentIndex = UISegmentedControlNoSegment;
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
if (CGRectContainsPoint(self.bounds, [[touches anyObject] locationInView:self])) {
[self sendActionsForControlEvents:UIControlEventTouchUpInside];
}
self.selectedSegmentIndex = UISegmentedControlNoSegment;
}
@end
Для базового использования вы можете использовать его в качестве замены выпадающего UIButton:
_button = [[SPWKBarButton alloc] initWithTitle:titles[0]];
[_button addTarget:self
action:@selector(doSomething:)
forControlEvents:UIControlEventTouchUpInside];
[self.navigationItem setTitleView:_button];
Событие сработает только тогда, когда касание произошло внутри границ сегментированного элемента управления. Наслаждайтесь.