关键词:
【中文标题】如何限制将捏缩放图像移动到图像边框?【英文标题】:How to restrict shifting of a pinch zoomed image to the image borders? 【发布时间】:2015-11-17 14:35:10 【问题描述】:我在情节提要中设置了一个scrollView
,其中包含一个imageView
,使用自动布局,如图所示here。
此外,我为此imageView
启用了捏缩放,如docs 中所述。
imageView
在scollView
的两侧有 4 个 0 约束,并且它与主视图具有相等的宽度和高度,主视图具有 scrollView
作为子视图。
imageView
具有aspectFit
缩放模式,因此在未缩放状态下,图像将完全从左到右或从上到下(或两者)延伸。
在下面的示例中,它从上到下延伸,使一些背景左右可见:
我可以捏缩放图像,使其比屏幕大:
我可以向上或向下移动缩放的图像,但在顶部或底部的背景变得可见之前移动停止。这是我想要的。
但是,我可以将缩放后的图像向左或向右移动,以便可以看到背景:
我怎样才能避免将图像移动这么远(这里,向右)。与顶部或底部一样,它应该在边界处停止移动,这样就看不到背景了。
【问题讨论】:
【参考方案1】:不是理想的解决方案,但我希望它会有所帮助:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
[self adjustScrollViewInsets];
- (void)adjustScrollViewInsets
CGFloat imageWidth = self.imageView.image.size.width;
CGFloat imageHeight = self.imageView.image.size.height;
CGFloat aspect = imageWidth / imageHeight;
CGSize imageViewSize = self.imageView.frame.size;
if (imageViewSize.width / aspect <= imageViewSize.height)
[self adjustVerticalInsetsWithImageHeight:(imageViewSize.width / aspect)];
else
[self adjustHorizontalInsetsWithImageWidth:(imageViewSize.height * aspect)];
- (void)adjustHorizontalInsetsWithImageWidth:(CGFloat)width
CGFloat horizontalInset = (self.scrollView.contentSize.width - width) / 2;
if (width < self.scrollView.frame.size.width)
horizontalInset = horizontalInset - (self.scrollView.frame.size.width - width) / 2;
[self.scrollView setContentInset:UIEdgeInsetsMake(0, -horizontalInset, 0, -horizontalInset)];
- (void)adjustVerticalInsetsWithImageHeight:(CGFloat)height
CGFloat verticalInset = (self.scrollView.contentSize.height - height) / 2;
if (height < self.scrollView.frame.size.height)
verticalInset = verticalInset - (self.scrollView.frame.size.height - height) / 2;
[self.scrollView setContentInset:UIEdgeInsetsMake(-verticalInset, 0, -verticalInset, 0)];
如果您遇到问题,请查看this repo。
【讨论】:
嗨弗拉基米尔,我测试了你的代码。它正确计算插入。奇怪的是,使用正确的参数应用 setContentInset: 后,1)显示没有改变,即图像的大小没有改变并且周围的背景(如果有的话)仍然可见,2)它不再可以在应用插入的方向滚动(如果原始图像是横向的,即高度 您好弗拉基米尔,我发现了问题:您的代码没有考虑缩放比例因子。如果,例如垂直插入被设置,它们被设置为可见区域,并且即使缩放的图像允许垂直滚动也不可能。为了纠正这个问题,必须将 adjustVerticalInsetsWithImageHeight: 的参数与 scrollView.zoomScale 相乘(水平类似)。如果您同意,请编辑您的答案,我会接受。 我无法重现您的滚动问题(使用模拟器测试,9.1)。您是从我的存储库还是您自己的实现中测试了一个项目?无需考虑缩放比例因子,因为内容的大小和图像视图的大小已经针对当前比例进行了计算。您能否提供有关滚动问题的更多信息?视频或示例项目会很有帮助。 我用自己的实现进行了尝试。我会尽快提供更多信息。 我在代码中发现了问题:在您的代码中,scrollView 将 imageView 作为子视图。当 scrollView 被缩放时,imageView 也被缩放,并且不需要像您的代码中那样额外的缩放因子。在我的代码中,scrollView 有一个intermediateView 作为子视图,intermediateView 有一个imageView 作为子视图。当 scrollView 被缩放时,intermediateView 也被缩放,而 imageView 没有被缩放。因此,adjustVerticalInsetsWithImageHeight:(imageViewSize.width / aspect)*zoomscale 和 adjustVerticalInsetsWithImageHeight:(intermediateViewSize.width / aspect) 都有效。再次感谢您的回答!【参考方案2】:我遇到了同样的问题,并在 Swift 4.0 中实现,如下所示,它对我有用。
Swift 4.0:
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
adjustScrollViewInsets()
func adjustScrollViewInsets()
let imageWidth = self.imageView.image?.size.width
let imageHeight = self.imageView.image?.size.height
let aspect = imageWidth! / imageHeight!
let imageViewSize = self.imageView.frame.size
if imageViewSize.width / aspect <= imageViewSize.height
adjustVerticalInsetsWithImageHeight(height: imageViewSize.width / 2)
else
adjustHorizontalInsetsWithImageWidth(width: imageViewSize.height / 2)
func adjustHorizontalInsetsWithImageWidth(width: CGFloat)
var horizontalInset = (self.scrollView.contentSize.width - width) / 2
if width < self.scrollView.contentSize.width
horizontalInset = horizontalInset - (self.scrollView.frame.size.width - width) / 2
self.scrollView.contentInset = UIEdgeInsetsMake(0, -horizontalInset, 0, -horizontalInset)
func adjustVerticalInsetsWithImageHeight(height: CGFloat)
var verticalInset = (self.scrollView.contentSize.height - height) / 2
if height < self.scrollView.frame.size.height
verticalInset = verticalInset - (self.scrollView.frame.size.height - height) / 2
self.scrollView.contentInset = UIEdgeInsetsMake(-verticalInset, 0, -verticalInset, 0)
【讨论】:
虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。如何移动和缩放图像[关闭]
】如何移动和缩放图像[关闭]【英文标题】:HowtomoveandscaleanImage[closed]【发布时间】:2012-10-0809:44:24【问题描述】:我的android应用程序中有一个Imageview。我想移动和缩放图像。我还想裁剪图像的选定部分(就像照片/图像编辑器一... 查看详情
在不移动叠加视图的情况下裁剪和缩放图像,而是在 ImageView 中移动图像
】在不移动叠加视图的情况下裁剪和缩放图像,而是在ImageView中移动图像【英文标题】:CropandZoomImagewithoutMovingOverlayViewInsteadMoveImageinImageView【发布时间】:2014-08-0511:51:33【问题描述】:您好,我想在不移动叠加视图的情况下裁... 查看详情
图像未放大时如何停止移动图像?
】图像未放大时如何停止移动图像?【英文标题】:howtostopmovingimagewhenimageisnotzoomedin?【发布时间】:2015-11-0211:14:36【问题描述】:我有一个UIImageView我正在执行缩放缩放和全缩放移动图像。我可以移动图像但问题是即使图像没有... 查看详情
在iOS中的iPad上捏缩放将图像移动到最左角?
】在iOS中的iPad上捏缩放将图像移动到最左角?【英文标题】:PinchzoomshiftingimagetomostleftcorneroniPadiniOS?【发布时间】:2016-01-3017:14:14【问题描述】:我在iOS中有一张图片。当我捏住它移动到左上角的图像时,我在图像上添加了捏合... 查看详情
iOS5 中的图像移动和缩放问题
】iOS5中的图像移动和缩放问题【英文标题】:ImagemoveandscaleissueiniOS5【发布时间】:2011-10-1810:07:20【问题描述】:最近我将我的iphone升级到了iOS5。升级到iOS5后,图像上通常的移动和缩放功能不起作用(UImagePickerController)。在iOs5... 查看详情
无论浏览器缩放级别如何,如何使图像连续排列?
】无论浏览器缩放级别如何,如何使图像连续排列?【英文标题】:Howtomakeimageslineupinarowregardlessofbrowserzoomlevel?【发布时间】:2011-09-2119:19:21【问题描述】:似乎无论我做什么,当我放大浏览器时,我都无法让一排图像水平排列... 查看详情
AppleTV 聚焦图像边框不缩放
】AppleTV聚焦图像边框不缩放【英文标题】:AppleTVfocusedimageborderdoesnotscale【发布时间】:2016-12-2310:36:53【问题描述】:我正在制作一个tvOS应用程序。我有一个集合视图单元,它有一个UIImageView。我在界面构建器中选中“聚焦时调... 查看详情
带有图像的 UIScrollView - 如何不缩放其中一个
】带有图像的UIScrollView-如何不缩放其中一个【英文标题】:UIScrollViewwithimages-hownottozoomoneofthem【发布时间】:2013-08-3011:58:48【问题描述】:我在scrollView中有很多imageViews。问题是我希望其中一个不要放大其图像。我无法将imageView... 查看详情
如何删除仅在 Chrome 中以不同缩放级别显示的透明图像叠加层上的边框?
】如何删除仅在Chrome中以不同缩放级别显示的透明图像叠加层上的边框?【英文标题】:HowdoIremoveaborderonatransparentimageoverlaywhichonlyappearsinChromeatdifferentzoomlevels?【发布时间】:2013-12-2010:30:09【问题描述】:不确定这是否可能是Chrom... 查看详情
如何将图像缩放到android中的指定坐标
】如何将图像缩放到android中的指定坐标【英文标题】:howtozoomtheimagetospecifiedcoordinatesinandroid【发布时间】:2016-04-2804:37:22【问题描述】:我想将图像缩放到图像的特定部分(到指定坐标)。我有一张图片,我在全屏的android图像... 查看详情
垂直添加元素时如何防止背景图像在移动浏览器上缩放?
】垂直添加元素时如何防止背景图像在移动浏览器上缩放?【英文标题】:Howtopreventbackground-imagefromzoomingonmobilebrowserwhenaddingelementsvertically?【发布时间】:2019-09-0913:58:31【问题描述】:我有一个ReactJS应用程序,当我按下“发布”... 查看详情
如何将图像 UIButton 缩放到插图?
】如何将图像UIButton缩放到插图?【英文标题】:HowtoscaleimageUIButtontotheinsets?【发布时间】:2016-10-1802:11:37【问题描述】:我有这个UIButton,但插图不在图像上,因此如果用户在图像边界之外但在插图内点击,则可以激活按钮。如... 查看详情
如何缩放视图并将自定义边框保持在原始大小\缩放?
】如何缩放视图并将自定义边框保持在原始大小\\\\缩放?【英文标题】:Howtoscaleviewandkeepcustombordersintheoriginalsize\\scale?如何缩放视图并将自定义边框保持在原始大小\\缩放?【发布时间】:2012-05-2713:38:50【问题描述】:我正在构... 查看详情
如何将边框图像添加到动态创建的图像?
】如何将边框图像添加到动态创建的图像?【英文标题】:HowcanIaddaborderimagetoadynamicallycreatedimage?【发布时间】:2020-02-1309:30:02【问题描述】:我正在从ajax调用中提取图像并尝试将其添加到已建立的div中。div已经包含我想用作边... 查看详情
你如何让背景图像快速缩放到屏幕大小?
】你如何让背景图像快速缩放到屏幕大小?【英文标题】:Howdoyoumakeabackgroundimagescaletoscreensizeinswift?【发布时间】:2014-11-2615:39:44【问题描述】:我正在尝试使用模式图像快速为我的背景制作UIView图像。除了我希望图像占据整个... 查看详情
如何将图像缩放到帧?
】如何将图像缩放到帧?【英文标题】:Howtoscaleanimagetoaframe?【发布时间】:2011-11-1123:32:40【问题描述】:是否可以将UIImage缩放到框架的大小?拍摄一张大图,然后将其“强行放入”较小的方框中。请举例说明【问题讨论】:【... 查看详情
移动图像缩放
makeimagesautoscaleformobilephonesimg{width:auto!important;height:auto!important;max-width:100%;} 查看详情
响应式移动图像缩放
allowsimagetoscaletofitmobilewindows.img{width:auto!important;height:auto!important;max-width:100%;} 查看详情