2009-05-14 10 views

risposta

17

Innanzitutto, impostare "contentSize" di UIScrollView in modo che abbia una larghezza uguale o inferiore alla larghezza della cornice di UIScrollView.

Successivamente, impostare "AlwaysBounceHorizontal" di UIScrollView su NO. Ciò impedirà la visualizzazione di scorrimento da "rubber banding" anche se hai detto che non c'è più contenuto orizzontale da visualizzare.

UIScrollView *scrollView; 
CGSize size = scrollView.contentSize; 
size.width = CGRectGetWidth(scrollView.frame); 
scrollView.contentSize = size; 
scrollView.alwaysBounceHorizontal = NO; 

Non importa ciò che è effettivamente all'interno della vista di scorrimento.

+0

Questo mi ha aiutato anche in Xcode 7. Ho dovuto disattivare il bounce nello storyboard per far funzionare il blocco della direzione (anche se avevo già attivato il blocco della direzione). –

2

La sottoclasse è UIScrollView e sostituisce il metodo touchesBegan:withEvent:, il metodo touchesMoved:withEvent: e il metodo touchesEnded:withEvent:.

Utilizzerai questi metodi, insieme ai punti di inizio e fine di un tocco, per calcolare quale tipo di evento di tocco ha avuto luogo: è stato un semplice tocco o uno scorrimento orizzontale o verticale?

Se si esegue uno scorrimento orizzontale, si annulla l'evento tocco.

Dai uno sguardo allo source code here per scoprire come iniziare.

+0

Meglio informare lo scrollview del tuo intento, penso che invece di annullare manualmente tocca te stesso. Con il tuo approccio, se inizi a trascinare orizzontalmente (anche se per sbaglio), non puoi trascinare verticalmente e farlo funzionare. –

+0

Avevo paura che qualcuno lo dicesse ... Un modo sicuro per bloccare un asse sono sicuro, ma penso che continuerò a cercare un modo più pigro per farlo. Grazie per la tua risposta però. Nick Farina ha risolto il mio problema suggerendo di: Innanzitutto, imposta "contentSize" di UIScrollView in modo che abbia una larghezza uguale o inferiore alla larghezza del frame di UIScrollView. Quindi, impostare "AlwaysBounceHorizontal" di UIScrollView su NO. Ciò impedirà la visualizzazione di scorrimento da "rubber banding" anche se hai detto che non c'è più contenuto orizzontale da visualizzare. – RexOnRoids

0
#import <UIKit/UIKit.h> 


@interface DemoButtonViewController : UIViewController <UIScrollViewDelegate> 

@property (nonatomic, strong) UIScrollView *filterTypeScrollView; 
@property (nonatomic, strong) UIBarButtonItem *lockButton; 

- (void)lockFilterScroll:(id)sender; 

@end 

#import "DemoButtonViewController.h" 

@implementation DemoButtonViewController 

@synthesize filterTypeScrollView; 
@synthesize lockButton; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 

    if (self) 
    { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor darkGrayColor]; 
    self.filterTypeScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 130, self.view.frame.size.width, 320)]; 
    filterTypeScrollView.contentSize = CGSizeMake(self.view.frame.size.width*4, 320); 
    filterTypeScrollView.pagingEnabled = YES; 
    filterTypeScrollView.delegate = self; 
    [self.view addSubview:filterTypeScrollView]; 

    UIToolbar *lockbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 450, self.view.frame.size.width, 30)]; 
    lockbar.barStyle = UIBarStyleBlackTranslucent; 
    self.lockButton = [[UIBarButtonItem alloc] initWithTitle:@"Lock Filter Scroll" style:UIBarButtonItemStylePlain target:self action:@selector(lockFilterScroll:)]; 
    [lockbar setItems:[NSArray arrayWithObjects:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],lockButton,nil]]; 
    [self.view addSubview:lockbar]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (void)lockFilterScroll:(id)sender 
{ 
    filterTypeScrollView.scrollEnabled = !filterTypeScrollView.scrollEnabled; 

    if (filterTypeScrollView.scrollEnabled) 
    { 
     [lockButton setTitle:@"Lock Filter Scroll"]; 
    } 
    else { 
     [lockButton setTitle:@"Unlock Filter Scroll"]; 
    } 
} 

@end 
Problemi correlati