I have coded up a solution to your particular requirement.
first, i implemented your code as you have described and observed the same problem you reported - spurious tap events being sent to tap handler, when you tapped on anything, including a UIButton.
this told me that the UITapGestureRecogniser was "stealing" the touches that should have gone to the UIButton, so i decided the simplest, most pragmatic solution was to use that feature to my advantage, and so i assigned a UITapGestureRecogniser to both the pickerview and the button also. the taps for the pickerview we just discard, the others we parse and pass on to the button's tap handler.
note - for expedience i assigned the pickerview's datasource and delegate in the xib. you will need to do that also, or set it in code.
header
//
//  ViewController.h
//  stackExchangeDemo
//
//  Created by unsynchronized on 18/01/12.
//  released to public domain via http://stackoverflow.com/a/8908028/830899
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController 
<UIPickerViewDelegate, UIPickerViewDataSource>
{
   UIButton *btn1; 
   UIPickerView *picker1;
}
@property (retain, nonatomic) IBOutlet UIButton *btn1;
@property (retain, nonatomic) IBOutlet UIPickerView *picker1;
@end
implementation
//
//  ViewController.m
//  stackExchangeDemo
//
//  Created by unsynchronized on 18/01/12.
//  released to public domain via http://stackoverflow.com/a/8908028/830899
//
#import "ViewController.h"
@implementation ViewController
@synthesize btn1;
@synthesize picker1;
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
-(void) handleSingleTap:(UITapGestureRecognizer *) tapper {
    if (tapper.state == UIGestureRecognizerStateEnded) {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
}
- (IBAction)handleButtonTap:(id)sender {
    NSLog(@"%@",NSStringFromSelector(_cmd));
}
-(void) handleButtonTapGesture:(UITapGestureRecognizer *) tapper {
    // call the buttons event handler
    UIControlEvents eventsToHandle = UIControlEventTouchUpInside;
    if (tapper.state == UIGestureRecognizerStateEnded) {
        UIButton *btn = (UIButton *) tapper.view;
        for (NSString *selName in [btn  actionsForTarget:self forControlEvent:eventsToHandle]) {
            SEL action = NSSelectorFromString(selName);
            if (action) {
                [self  performSelector:action withObject:btn1];
                break;
            }
        };  
    }
}
-(void) handleDummyTap:(UITapGestureRecognizer *) tapper {
    // silently ignore the tap event for this view.
}
-(void) setupTap:(UIView *) view action:(SEL)action {
    // assign custom tap event handler for given view.
    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:action];
    [view addGestureRecognizer:gestureRecognizer];
    [gestureRecognizer release];    
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self setupTap:self.view action:@selector(handleSingleTap:)];
    [self setupTap:picker1 action:@selector(handleDummyTap:)];
    [self setupTap:btn1 action:@selector(handleButtonTapGesture:)];
}
- (void)viewDidUnload
{
    [self setBtn1:nil];
    [self setPicker1:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
#pragma mark @protocol UIPickerViewDataSource<NSObject>
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}
// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return 1;
}
#pragma mark @protocol UIPickerViewDelegate<NSObject>
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [@"so long and thanks for all the fish".copy autorelease ];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    NSLog(@"%@",NSStringFromSelector(_cmd));
}
- (void)dealloc {
    [btn1 release];
    [picker1 release];
    [super dealloc];
}
@end