Ios 如何为UIScrollView启用方向锁定?

Ios 如何为UIScrollView启用方向锁定?,ios,swift,uiscrollview,Ios,Swift,Uiscrollview,我有一个uicrollview,里面有一个UIView。我想锁定x轴,以便仅垂直滚动视图。如何启用方向锁定 您将子类化UIScrollView并覆盖touchesBegind:withEvent:方法、touchesMoved:withEvent:方法和toucheseEnded:withEvent:方法 您将使用这些方法以及触摸的起点和终点来计算发生了什么样的触摸事件:是简单的点击,还是水平或垂直滑动 如果是水平滑动,则取消触摸事件 看一看,了解如何开始 首先,将UIScrollView的co

我有一个
uicrollview
,里面有一个
UIView
。我想锁定x轴,以便仅垂直滚动视图。如何启用方向锁定

您将子类化
UIScrollView
并覆盖
touchesBegind:withEvent:
方法、
touchesMoved:withEvent:
方法和
toucheseEnded:withEvent:
方法

您将使用这些方法以及触摸的起点和终点来计算发生了什么样的触摸事件:是简单的点击,还是水平或垂直滑动

如果是水平滑动,则取消触摸事件


看一看,了解如何开始

首先,将
UIScrollView
contentSize
设置为宽度等于或小于UIScrollView框架的宽度

接下来,将
UIScrollView的
设置为否。这将防止滚动视图“橡皮筋”,即使您告诉它没有更多的水平内容可显示

UIScrollView *scrollView;
CGSize size = scrollView.contentSize;
size.width = CGRectGetWidth(scrollView.frame);
scrollView.contentSize = size;
scrollView.alwaysBounceHorizontal = NO;
滚动视图中的实际内容并不重要

Swift 5.0

let scrollView = UIScrollView() // Or however you want to initialize it
var size = scrollView.contentSize
size.width = scrollView.frame.width
scrollView.contentSize = size
scrollView.alwaysBounceHorizontal = false
#导入
@界面DemoButtonViewController:UIViewController
@属性(非原子,强)UIScrollView*filterTypeScrollView;
@属性(非原子,强)UIBarButtonItem*锁定按钮;
-(无效)lockFilterScroll:(id)发送方;
@结束
#导入“DemoButtonViewController.h”
@实现DemoButtonViewController
@综合过滤器类型滚动视图;
@综合锁定按钮;
-(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
如果(自我)
{
//自定义初始化
}
回归自我;
}
-(无效)未收到记忆警告
{
//如果视图没有superview,则释放该视图。
[超级记忆警告];
//释放所有未使用的缓存数据、图像等。
}
-(无效)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*4320);
filterTypeScrollView.PaginEnabled=是;
filterTypeScrollView.delegate=self;
[self.view addSubview:filterTypeScrollView];
UIToolbar*lockbar=[[UIToolbar alloc]initWithFrame:CGRectMake(0450,self.view.frame.size.width,30)];
lockbar.barStyle=UIBarStyleBlack半透明;
self.lockButton=[[UIBarButtonItem alloc]initWithTitle:@“锁定筛选器滚动”样式:uibarbuttonimStyleplain目标:自我操作:@selector(lockFilterScroll:)];
[lockbar setItems:[NSArray arrayWithObjects:[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace目标:无操作:无],锁定按钮,无]];
[self.view addSubview:lockbar];
}
-(无效)视图卸载
{
[超级视频下载];
}
-(布尔)应自动旋转指针面定向:(UIInterfaceOrientation)interfaceOrientation
{
//对于支持的方向返回YES
返回(interfaceOrientation==UIInterfaceOrientationGraphic);
}
-(无效)lockFilterScroll:(id)发件人
{
filterTypeScrollView.scrollEnabled=!filterTypeScrollView.scrollEnabled;
如果(filterTypeScrollView.scrollEnabled)
{
[锁定按钮设置标题:@“锁定过滤器滚动”];
} 
否则{
[锁定按钮设置标题:@“解锁过滤器滚动条”];
}
}
@结束

我认为最好将您的意图告知scrollview,而不是自己手动取消触摸。在你的方法中,如果你开始水平拖动(即使是偶然),你就不能垂直拖动并让它工作。我担心有人会这么说……我肯定这是一种锁定轴的可靠方法,但我想我会继续寻找一种更懒惰的方法来实现这一点。谢谢你的回复。Nick Farina通过建议解决了我的问题:首先,将UIScrollView的“contentSize”设置为宽度等于或小于UIScrollView框架的宽度。接下来,将UIScrollView的“alwaysBounceHorizontal”设置为否。这将防止滚动视图出现“橡皮筋”,即使您告诉它没有更多的水平内容可显示。这在Xcode 7中也对我有所帮助。我必须关闭情节提要中的“反弹”以使方向锁工作(即使我已经启用了方向锁)。
#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