【问题标题】:How to dynamically reposition UIButton as subview of UIImageView when rotating旋转时如何将 UIButton 动态重新定位为 UIImageView 的子视图
【发布时间】:2012-06-23 16:02:56
【问题描述】:

我正在开发一款 iPad 应用程序,该应用程序可让您控制智能房屋原型中的不同事物。例如,它可以让您打开和关闭灯。为此,我制作了一个 UIImageView 来显示房子的平面图,并添加了 UIButtons 作为每个可以切换的灯的子视图。

如您所见,使用每个UIButtonsetFrame 方法将按钮完美地放置在平面图上。但是,当我将 iPad 旋转到纵向时,会发生以下情况:

按钮显然仍然具有相同的原点,但它与图像的重新定位无关。

平面图图像具有以下支柱和弹簧设置:

并将其内容模式设置为Aspect Fit

我的问题是

如何动态重新定位每个UIButton,使其具有相同的相对位置。我想我必须在 {did/should}AutorotateToInterfaceOrientation 委托方法中处理这个问题。

应该注意UIImageView 是可缩放的,为了解决这个问题,我实现了scrollViewDidZoom 委托方法,如下所示:

for (UIView *button in _floorPlanImage.subviews) {       
    CGRect oldFrame = button.frame;
    [button.layer setAnchorPoint:CGPointMake(0.5, 1)];
    button.frame = oldFrame;
    button.transform = CGAffineTransformMakeScale(1.0/scrollView.zoomScale, 1.0/scrollView.zoomScale);
}

提前谢谢你!

【问题讨论】:

  • 您是否尝试取消勾选该视图的自动调整大小子视图?
  • 很好的问题,完美的解释和说明。
  • @LuisOscar 是的,不幸的是,我尝试过这样做但没有成功。

标签: objective-c xcode ipad ios5


【解决方案1】:

我发现布局子视图的最佳方式是使用- (void) layoutSubviews 方法。您必须继承您的 UIImageView 并覆盖该方法。

这个方法会在你的框架发生变化时自动被调用,并且在你的视图第一次出现时也会被调用。

如果你把你所有的布局代码都放在这个方法中,它可以防止布局碎片和重复,将你的视图代码保留在你的视图中,并且大多数事情都默认工作。

【讨论】:

  • 听起来是一个非常好的方法!但是,您对layoutSubviews 中的代码的外观有什么建议吗,这样按钮会出现在与旋转前相同的位置?是否有一些 API 可以动态执行此操作?提前致谢!
  • @Zappel 好吧,我的建议是根据您的应用程序的内部数据仅将按钮定位在 layoutSubviews 中。听起来(尽管我不完全确定)您的位置数据目前只存在于视图对象中,如果视图控制器决定在内存不足或其他原因时释放视图,这可能是个坏主意。跨度>
  • @Zappel 如果您只想更新位置而不重构数据的保存位置,您应该查看 UIImageView 的 contentMode 属性并根据该属性重新定位按钮(使用手动计算)。但是,我建议移动数据。
  • 位置数据不是视图对象的一部分。我有一个名为FloorPlanButton 的对象,它继承自UIButton 并具有一些自定义属性——包括CGPoint,其中包含各个按钮的位置。我只是认为可能存在一些巧妙的方法来计算每个按钮的新位置,相对于旋转前的位置?
  • @Zappel 好的,听起来不错。我的建议只是将首先放置按钮的任何代码移动到 layoutSubviews 方法中,然后在需要时根据数据更新位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2015-02-03
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多