【发布时间】:2014-04-30 05:28:59
【问题描述】:
我在弄清楚如何最好地重新定位我的 UIScrollView 的图像视图时遇到了很多麻烦(我现在有一个图库类型的应用程序,类似于 Photos.app,特别是当您查看单个图像)当方向从纵向切换到横向时,反之亦然。
我知道我最好的办法是操纵 contentOffset 属性,但我不确定应该将其更改为什么。
我玩过很多次,无论出于何种原因,128 似乎都非常好用。在我的视图控制器的 viewWillLayoutSubviews 方法中,我有:
if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) {
CGPoint newContentOffset = self.scrollView.contentOffset;
if (newContentOffset.x >= 128) {
newContentOffset.x -= 128.0;
}
else {
newContentOffset.x = 0.0;
}
newContentOffset.y += 128.0;
self.scrollView.contentOffset = newContentOffset;
}
else {
CGPoint newContentOffset = self.scrollView.contentOffset;
if (newContentOffset.y >= 128) {
newContentOffset.y -= 128.0;
}
else {
newContentOffset.y = 0.0;
}
newContentOffset.x += 128.0;
self.scrollView.contentOffset = newContentOffset;
}
而且效果很好非常好。我讨厌它使用幻数的方式,而且我不知道它是从哪里来的。
此外,每当我缩放图像时,我都会将其设置为居中(就像 Photos.app 一样):
- (void)centerScrollViewContent {
// Keep image view centered as user zooms
CGRect newImageViewFrame = self.imageView.frame;
// Center horizontally
if (newImageViewFrame.size.width < CGRectGetWidth(self.scrollView.bounds)) {
newImageViewFrame.origin.x = (CGRectGetWidth(self.scrollView.bounds) - CGRectGetWidth(self.imageView.frame)) / 2;
}
else {
newImageViewFrame.origin.x = 0;
}
// Center vertically
if (newImageViewFrame.size.height < CGRectGetHeight(self.scrollView.bounds)) {
newImageViewFrame.origin.y = (CGRectGetHeight(self.scrollView.bounds) - CGRectGetHeight(self.imageView.frame)) / 2;
}
else {
newImageViewFrame.origin.y = 0;
}
self.imageView.frame = newImageViewFrame;
}
所以我需要它来保持正确定位,以便在重新定位时不会在图像周围显示黑色边框。 (这就是第一个代码块中的检查的用途。)
基本上,我很好奇如何实现像 Photos.app 中的功能,在旋转时滚动视图智能地重新定位内容,以便旋转前可见内容的中间是相同的旋转后,所以感觉是连续的.
【问题讨论】:
-
我期待看到答案...我已经花费了太多时间试图找出这个确切的问题。
-
您是要显示一组图像(类似缩略图)还是单个图像?您一直在引用 Photos.app,但不清楚您是否指的是图像检查的集合。如果它是您试图展示的图像集合,那么您肯定想要使用 UICollecitonView。如果是图像视图检查,您可能想尝试让缩放始终与设备的较长侧同步拉伸(纵向高度)。
-
抱歉,这确实是针对单个图像,所以为了保持 Photos.app 的比喻,当您点击图库中的图像时,屏幕就会出现。
标签: ios objective-c cocoa-touch uiscrollview uiimageview