我正在制作一个需要知道用户何时滚动的Mac应用程序NSScrollView,但是,我找不到任何类似的方法UIScrollView,它具有以下委托方法:
– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:
Run Code Online (Sandbox Code Playgroud)
我可以为App Kit使用类似的委托方法吗?提前致谢.
凯.
有没有办法停用UIScrollView的减速?
我想允许用户滚动画布,但我不希望画布在用户抬起手指后继续滚动.
好吧,所以这里的关键是我根本不使用IB,因为我正在使用的View是以编程方式创建的.该UIView覆盖下半部分的屏幕,并有一堆上的按钮.但是,我想添加更多按钮UIView,而不是更大.为此,我想UIScrollView在视图内部进行操作,这将允许我在屏幕上添加更多按钮,以便用户可以滚动到它们.我认为这是它的工作原理.
self.manaView = [[[UIView alloc] initWithFrame:frame] autorelease];
self.manaView.backgroundColor = [UIColor purpleColor];
UIScrollView *scroll = [UIScrollView alloc];
scroll.contentSize = CGSizeMake(320, 400);
scroll.showsHorizontalScrollIndicator = YES;
[self.manaView addSubview:scroll];
Run Code Online (Sandbox Code Playgroud)
代码的第一部分引用了我的UIView,它工作得很好,但我无法弄清楚如何以UIScrollView编程方式进行并将其添加到视图中,然后向其添加按钮.
UIButton *ret2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
ret2.tag = 102;
ret2.frame = CGRectMake(255, 5, 60, 50);
[ret2 setTitle:@"Return" forState:UIControlStateNormal];
[ret2 addTarget:self action:@selector(flipAction:) forControlEvents:UIControlEventTouchUpInside];
[scroll addSubview:ret2];
Run Code Online (Sandbox Code Playgroud)
当我这样做时,按钮就会从屏幕上消失.那么我该怎么做呢?谢谢您的帮助!
我有一个滚动视图,用于滚动它没有全部按钮.现在它确实如此,当拖动鼠标时(在模拟器上)没有任何反应(我认为因为按钮被推动).我怎么能做到这一点?
今天,在我的创作时间,我做了一些非常全面的研究,如何从UIScrollView窃取触摸并立即将它们发送到特定的子视图,同时保持其余滚动视图的默认行为.考虑在UITableView中使用UIPickerView.默认行为是,如果您将手指拖到选择器视图上,滚动视图将滚动,选择器视图将保持不变.
我尝试的第一件事是覆盖
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
Run Code Online (Sandbox Code Playgroud)
并且根本不允许UIScrollView取消选择器视图内的触摸.这有效,但它有一个令人不快的副作用.您希望选择器视图立即响应,因此您必须设置delaysContentTouches为NO.问题是您不希望表视图的其余部分立即响应,因为如果确实如此,表视图单元将始终在滚动开始之前突出显示几毫秒.
我尝试的第二件事是覆盖
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)
因为我已经读过滚动视图总是返回自己,所以它会"窃取"其子视图中的触摸,然后如果它们对滚动视图不感兴趣则将它们发送到子视图.但是,这不再适用.UIScrollView的hitTest的默认实现:withEvent:实际上返回应该接收触摸的子视图.相反,它使用手势识别器来拦截触摸.
所以我尝试的第三件事就是实现我自己的手势识别器,如果触摸在选择器视图之外,则会导致失败,否则会成功.然后我将所有滚动视图的手势识别器设置为失败,除非我的手势识别器使用以下代码失败:
for (UIGestureRecognizer * gestureRecognizer in self.tableView.gestureRecognizers)
{
[gestureRecognizer requireGestureRecognizerToFail:myRecognizer];
}
Run Code Online (Sandbox Code Playgroud)
事实上这实际上是从滚动视图中窃取了触摸,但是拾取器视图从未接收到它们.所以我可能只是发送我的手势识别器使用此代码接收的所有触摸:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches)
[touch.view touchesBegan:touches withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)
以上代码是简化版.我还确保视图是一个选择器视图(或其中一个子视图),并为上面提到的手势识别器设置适当的状态.我也做了同样的取消,结束和感动.但是,选择器视图仍然没有响应.
在回到我的日常工作之前,我还尝试了最后一件事.在我广泛的谷歌搜索过程中,我读到嵌套的UIScrollViews从3.x开始就神奇地工作了,所以我尝试将我的选择器视图放在嵌套的UIScrollView中并在其上设置以下属性:
scrollView.delaysContentTouches = NO;
scrollView.canCancelContentTouches = NO;
Run Code Online (Sandbox Code Playgroud)
正如人们所期望的那样,外部滚动视图不会处理内部滚动视图与处理选择器视图时的任何不同,因此内部滚动视图没有接收到触摸.我认为这是一个很长的镜头,但它很容易实现,所以我认为值得一试.
我所知道的是UIScrollView有一个名为UIScrollViewDelayedTouchesBeganGestureRecognizer截取触摸的手势识别器,并在150(?)ms之后将它们发送到适当的子视图.我想我应该能够写一个类似的识别器,导致滚动视图的默认识别器失败,而不是延迟触摸立即将它们发送到选择器视图.因此,如果有人知道如何编写这样的识别器,请告诉我,如果您有任何其他问题的解决方案,那么您也非常欢迎.
感谢您阅读整个问题,即使您不知道答案,您仍然可以提出问题,以便得到更多关注(希望能得到答案的人).谢谢!:)
使用严格的自动布局环境缩放UIScrollView似乎不起作用.
这特别令人沮丧,因为iOS 6发行说明肯定让我相信它应该在写下关于"纯自动布局方法"的时候http://developer.apple.com/library/ios/#releasenotes/General/RN- iOSSDK-6_0/_index.html
我查看了WWDC 2012幻灯片的会话202,228和232,并没有看到答案.
我在互联网上专门针对这个问题看到的唯一问题是UIScrollView使用自动布局进行缩放,但是它没有提供问题的代码,也没有答案.
这个用户/sf/users/23939611/对UIScrollView自动布局问题给出了很多很好的回复,甚至链接到git hub上的代码,但我找不到任何可以解决这个问题的东西.
我试图将这个问题降到最低限度,以便明确.
我使用故事板创建了一个新的单视图应用程序,并且在界面构建器中没有进行任何更改.
我在项目"pic.jpg"中添加了一个大图片文件.
SVFViewController.h
#import <UIKit/UIKit.h>
@interface SVFViewController : UIViewController <UIScrollViewDelegate>
@property (nonatomic) UIImageView *imageViewPointer;
@end
Run Code Online (Sandbox Code Playgroud)
SVFViewController.m
#import "SVFViewController.h"
@interface SVFViewController ()
@end
@implementation SVFViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIScrollView *scrollView = [[UIScrollView alloc] init];
UIImageView *imageView = [[UIImageView alloc] init];
[imageView setImage:[UIImage imageNamed:@"pic.jpg"]];
[self.view addSubview:scrollView];
[scrollView addSubview:imageView];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
imageView.translatesAutoresizingMaskIntoConstraints …Run Code Online (Sandbox Code Playgroud) 我有一个水平滚动collectionView,每个单元格都是视图的大小.当我浏览collectionView时,它不会逐个页面.单元格不在屏幕的中心.我已经尝试了很多东西试图解决它,并没有任何运气.以下是该问题的视频:https: //www.youtube.com/watch ?v = tXsxWelk16w有什么想法吗?
我想要一个带有图像内容视图的滚动视图.图像实际上是比屏幕大得多的地图.地图应该最初位于滚动视图的中心,就像将iPhone转为横向时照片应用程序中的照片一样.

我没有设法将地图放在中心,同时正确缩放和滚动.如果地图图像从屏幕顶部开始(纵向),则代码如下所示:
- (void)loadView {
mapView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"map.jpg"]];
CGFloat mapHeight = MAP_HEIGHT * SCREEN_WIDTH / MAP_WIDTH;
mapView.frame = CGRectMake(0, 0, SCREEN_WIDTH, mapHeight);
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
scrollView.delegate = self;
scrollView.contentSize = mapView.frame.size;
scrollView.maximumZoomScale = MAP_WIDTH / SCREEN_WIDTH;
scrollView.minimumZoomScale = 1;
[scrollView addSubview:mapView];
self.view = scrollView;
}
Run Code Online (Sandbox Code Playgroud)
当我将图像帧移动到中心时,图像仅从其帧的顶部向下生长.我尝试使用mapView变换,动态更改imageView的帧.到目前为止,对我来说没什么用.
我一直很难找到UIScrollView的好例子.即使是Apple的UIScrollView Suite,我也觉得有点缺乏.
我正在寻找一个教程或示例集,向我展示如何创建类似于iPhone Safari选项卡滚动的内容,当您从一个浏览器窗口缩小并可以轻弹到其他浏览器窗口时.
但是我很难在滚动视图中显示任何旧视图.我有一个设置了图像的视图,但当我将它添加到滚动视图时,我只得到一个黑色矩形,无论我放在我添加的视图中.
任何链接或代码片段都会很棒!
我正在调整一个详细视图控制器的状态,就在它按下之前navigationController:
[self.detailViewController detailsForObject:someObject];
[self.navigationController pushViewController:self.detailViewController
animated:YES];
Run Code Online (Sandbox Code Playgroud)
在DetailViewController一个scrollView驻留.我根据传递的对象调整了哪些内容:
- (void)detailsForObject:(id)someObject {
// set some textView's content here
self.contentView.frame = <rect with new calculated size>;
self.scrollView.contentSize = self.contentView.frame.size;
self.scrollView.contentOffset = CGPointZero;
}
Run Code Online (Sandbox Code Playgroud)
现在,这一切都有效,但scrollView会contentOffset在navigationController的滑入式动画中调整它.在contentOffset将被设置为最后contentSize和新计算之间的差异.这意味着第二次打开detailsView时,详细信息将滚动到某个不需要的位置.即使我设置contentOffset来CGPointZero明确.
我发现,重新contentOffset在- viewWillAppear没有任何效果.我能想到的最好的方法是重置contentOffset viewDidAppear,导致内容明显上下移动:
- (void)viewDidAppear:(BOOL)animated {
self.scrollView.contentOffset = CGPointZero;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法防止UIScrollView它contentOffset在contentSize改变时调整它?
uiscrollview ×10
iphone ×6
ios ×5
objective-c ×4
cocoa-touch ×3
autolayout ×1
cocoa ×1
contentsize ×1
ios4 ×1
macos ×1
nested ×1
nsscrollview ×1
uibutton ×1
uipickerview ×1
zoom ×1