我正在尝试在UIScrollView中创建一个UIView,它只包含一个由UIBezierPath或CG函数淹没的简单网格(行和行).问题是,当我有更大的UIScrollView内容大小(以及更大的子视图)时,在绘制网格期间会分配大量内存(50MB或更多).
UIViewController,它在整个场景中只包含UIScrollView - 在viewDidLoad中添加子视图:
@interface TTTTestViewController()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end
@implementation TTTTestViewController
-(void)viewDidLoad
{
[super viewDidLoad];
// create the subview
TTTTestView *testView = [[TTTTestView alloc] init];
[self.scrollView addSubview:testView];
//set its properties
testView.cellSize = 50;
testView.size = 40;
// set the content size and frame of testView by the properties
self.scrollView.contentSize = CGSizeMake(testView.cellSize * testView.size, testView.cellSize * testView.size);
testView.frame = CGRectMake(0, 0, self.scrollView.contentSize.width, self.scrollView.contentSize.height);
// let it draw the grid
[testView setNeedsDisplay];
}
@end
Run Code Online (Sandbox Code Playgroud)
仅使用UIBezierPath/CG函数绘制网格的内部视图 - 取决于属性大小(行/列计数)和cellSize(网格中一个单元格的宽度/高度):
#define …Run Code Online (Sandbox Code Playgroud) 我有一个UIScrollView,顶部有一些细节,标签等,底部有一个HTML内容的UIWebView.(我知道我不应该在UIScrollView中放置UIWebView,但我需要所有内容都可以滚动,而不仅仅是webview).
我的步骤是:
1)我设置UIWebView scrollEnabled=NO,并计算UIWebView内容大小并更新其框架:(在webViewDidFinishLoad:(UIWebView *)webView)
CGRect WebViewFrame = webView.frame;
WebViewFrame.size.height = 1;
webView.frame = WebViewFrame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
WebViewFrame.size = fittingSize;
webView.frame = WebViewFrame;
Run Code Online (Sandbox Code Playgroud)
2)我计算所有UIScrollView的内容并更新它contentSize:
CGFloat contentHeight = 0;
contentHeight += mainInfoView.frame.size.height;
contentHeight += .......
contentHeight += webView.frame.size.height;
[scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, contentHeight)];
Run Code Online (Sandbox Code Playgroud)
起初这似乎工作得很好,UIWebView调整大小到正确的大小,UIScrollView的contentSize似乎按预期扩展.
问题是当我滚动或移动滚动视图时,UIWebView立即返回其原始大小,我认为UIScrollView contentSize也会发生变化.我不明白为什么.
任何帮助将非常感谢!
我理解帧和边界之间的区别我认为,边界是视图的局部坐标系,而帧是超视图.
但是,使用scrollviews,我有点困惑.
当我在UIScrollView中有一个UIImageView并且用它来缩放它时,似乎框架变大(宽度和高度)也会增加相应UIImage的宽度和高度.
但是,看起来UIImageView的界限根本没有变化.
为什么是这样?滚动视图如何适用于所有这些?我已经阅读了多个问题并检查了文档,但这个解释让我望而却步.
如何放大UIScrollView会影响其内容?它只是改变缩放视图的框架,但不知何故不是边界?
在下面的代码示例中self.contentView引用了相关UIScrollView问题.
// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height -
self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
[self.contentView setContentOffset:bottomOffset animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,在iOS 6中,这非常好用,但在iOS 7中,滚动视图(假设它contentSize的垂直大于它frame.size.height)只滚动到添加到滚动视图的最底部子视图的最底部.
例如,如果以下情况适用:
self.contentView.frame.size.height == 50.0
self.contentView.contentSize.height == 100.0
aSubView.frame.origin.y == 50.0
aSubView.frame.size.height == 20.0
Run Code Online (Sandbox Code Playgroud)
滚动代码只会滚动直到aSubView可见; self.contentView.contentOffset.y == 20.0而不是self.contentView.contentOffset.y == 50.0在整个滚动视图的底部.
这是(当然)直到以编程方式添加另一个子视图self.contentView(通过用户交互),然后一切都自行纠正.
为清楚起见,我在滚动代码之前和之后设置断点来测量更改self.contentView.contentOffset.
其他有趣的事实,如果我直接删除animated并设置contentOffset它在iOS 7上按预期工作,但我更喜欢保持动画.
注意:不使用界面构建器
在Xcode 5.0.2我创建了一个通用的应用程序,并拖了UIScrollView和UIImageView到iPhone和iPad故事板(这里全屏):

然后我试图board.png通过ViewController.m中的以下代码加载图像(版权所有Wikipedia Commons,Denelson83):
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *img = [UIImage imageNamed:@"board"];
NSLog(@"%s: img=%@ (%f x %f)", __PRETTY_FUNCTION__,
img, img.size.width, img.size.height);
_imageView.image = img;
_scrollView.contentSize = img.size;
}
Run Code Online (Sandbox Code Playgroud)
但是结果被压扁并且图像无法滚动:
-[ViewController viewDidLoad]: img=<UIImage: 0x10912d770> (1000.000000 x 961.500000)
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?我怀疑图像是在底部切断的,因为我运行的是3.5英寸的iPhone模拟器?如何解决这个问题呢?
更新:
我试图在滚动视图中添加四个0约束,这样它就占据整个屏幕,但是当我用Cmd-Arrow旋转模拟器时 - 滚动视图不会调整大小(这里是Xcode的全屏):


更新2:
当我UIImageView在Xcode故事板中将"视图模式" 更改为"左上角"并将源代码更改为以下内容:
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *img = [UIImage imageNamed:@"board"];
_imageView.image = img;
_imageView.frame = CGRectMake(0, 0, img.size.width, …Run Code Online (Sandbox Code Playgroud) 我有一个全屏UIScrollView,我在其中放置我的UIImageView(子视图).但是当我将此控制器与我的UINavigationController连接时,其中的图像被拉下(与条形图相同的高度).
尝试以下方法:
self.edgesForExtendedLayout = UIRectEdgeNone;
还尝试重置帧位置或偏移.什么都没有帮助.
cocoa-touch objective-c uiscrollview uinavigationcontroller ios
我发现当我尝试滚动滚动时,如果你拖动其中一个按钮,它会阻止滚动视图滚动.如果要拖动不包含任何内容的scrollview的空白部分,它将滚动.有谁知道解决这个问题?
我的.h文件只有一个滚动视图和一个顶部的图像:
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UIImageView *bodyImage;
Run Code Online (Sandbox Code Playgroud)
我的.m文件有此功能可以滚动
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[_scrollView setScrollEnabled:YES];
[_scrollView setContentSize:CGSizeMake(640, 1136)];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
Run Code Online (Sandbox Code Playgroud)
然后我在图像顶部添加了一个按钮,并将其推送到另一个视图控制器.
我可以看到为什么它只是单击按钮并转到下一个视图,因为按钮位于顶部!我基本上只是希望用户能够在页面上滚动,当他/她实际点击时,它会转到下一个视图!
谢谢你帮助大家,我真的很感激.
我的目标是有效地使用UIScrollView作为UISlider.
我已经设法编写了一个UISlider来改变图像的alpha,但是我想编写一个scrollview来改变图像滚动时的alpha值.
我认为我在右侧使用滚动视图内容偏移来调整滚动视图委托中的alpha平衡,但我似乎无法让代码工作!
关于如何做到这一点的任何建议?
谢谢
这是设置:
问题是,当UIImageView可见并且用户触摸它时,触摸会通过UIImageView传递到UIScrollView并滚动.
如何防止触摸通过UIImageView?
我正在尝试使用故事板构建一个场景.在那里我有一个scrollView,它有以下约束.

在滚动视图中,我有一个普通的视图,它有以下约束.

现在在视图中我有几个标签和其他对象.对于第一个标签,我从视图的顶部空格为0.但是出现以下结果.

您可以注意到标签"Type"上方的空格.
请帮我解决一下这个.谢谢.
ios ×10
uiscrollview ×10
objective-c ×5
iphone ×2
uiimageview ×2
alpha ×1
cocoa-touch ×1
drawing ×1
memory ×1
scroll ×1
scrollview ×1
swift ×1
uibezierpath ×1
uibutton ×1
uiview ×1
uiwebview ×1
xcode6 ×1