2009-05-14 7 views

Respuesta

17

Primero, configure "contentSize" de UIScrollView para que tenga un ancho que sea igual o menor que el ancho del marco de UIScrollView.

A continuación, establezca "alwaysBounceHorizontal" de UIScrollView en NO. Esto evitará que la vista de desplazamiento tenga "bandas de goma" aunque ya haya dicho que no hay más contenido horizontal para mostrar.

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

No importa qué hay realmente dentro de la vista de desplazamiento.

+0

Esto me ayudó incluso en Xcode 7. Tuve que desactivar el rebote en el guión gráfico para que el bloqueo de dirección funcionara (aunque ya tenía el bloqueo de dirección activado). –

2

Subcribirá UIScrollView y reemplazará el método touchesBegan:withEvent:, el método touchesMoved:withEvent: y el método touchesEnded:withEvent:.

Utilizará esos métodos, junto con los puntos inicial y final de un toque, para calcular qué tipo de evento táctil tuvo lugar: ¿se trató de un simple toque o de un deslizamiento horizontal o vertical?

Si se trata de un deslizamiento horizontal, se cancela el evento táctil.

Eche un vistazo a source code here para saber cómo puede comenzar.

+0

Mejor informar la vista de desplazamiento de su intento Creo que en lugar de cancelar manualmente toca. Con su enfoque, si comienza a arrastrar horizontalmente (aunque sea por accidente), no puede arrastrar verticalmente y hacer que funcione. –

+0

Temía que alguien dijera esto ... Una forma segura de bloquear un eje, estoy seguro, pero creo que seguiré buscando una forma más perezosa de hacerlo. Gracias de todos modos por tu respuesta. Nick Farina resolvió mi problema sugiriendo a: Primero, configure "contentSize" de UIScrollView para que tenga un ancho que sea igual o menor que el ancho del marco de UIScrollView. A continuación, establezca "alwaysBounceHorizontal" de UIScrollView en NO. Esto evitará que la vista de desplazamiento tenga "bandas de goma" aunque ya haya dicho que no hay más contenido horizontal para mostrar. – 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 
Cuestiones relacionadas