2

我正在开发一个 iOS-6 应用程序。我有一个需要固定方向(纵向模式)UIViewController视图。但是当手机旋转时,需要移动和旋转该视图上的一个控件(以便它始终位于左上角,并且其文本将是可读的)。

我通过UIView使用我的控件的 frame-property(它是一个自定义视图,稍后会详细介绍)来移动 control(a) 来实现这一点,然后再使用CGAffineTRansformMakeRotate(),因为我知道不建议使用frameafter 旋转 a查看。到目前为止一切都很好,但事情是这样的:那个自定义视图有三个UIButtons类型UIButtonTypeCustom作为它的subviews。因为我旋转了View,但无法旋转视图内的按钮(它们不是正方形),所以我需要旋转Buttons以使文本在新titleLabels的.deviceOrientation

但它不会很好地工作。文本将按照我的意图旋转,但会被 剪裁titleLabel,因为titleLabel有错误的框架。我通过对标签应用边框来检查这一点。所以我需要改变titleLabels 框架,对吗?但我该怎么做呢?我尝试使用 设置它[titleLabel setFrame: frameThatFits];,但无济于事。(frameThatFitsCGRect我创建的)。此外,呼叫[button.titleLabel sizeToFit];没有我能看到的效果。我[button setTitle:title forControlState: UIControlStateNormal];用来设置标题。

TL; DR:我正在尝试在使用仿射变换旋转它之后更改它的框架/边界。UIButtons titleLabel有什么帮助吗?谢谢。

PS:我可以在需要时提供代码,但我不知道该向您展示什么。告诉我你需要什么,我会发布它。

4

2 回答 2

0

好的,首先,感谢所有试图提供帮助的人。我为我的问题发布了一个替代解决方案,虽然它并没有真正解决更改 titleLabels 尺寸的问题,但它会导致我的 ViewController 正确显示。事实证明,使用框架是一个坏主意。我最初使用框架来重新定位视图,我认为这不是问题,因为我之后才应用过转换,但我错了。因为显然我试图改变 titleLabels 框架。旋转后。那没有用。所以这里的方法是在整个代码中一致地使用中心属性和视图的边界。它将导致正确旋转的按钮,之后不需要任何烦躁。我在这里的收获是,我永远不会再在 NSLog 语句之外使用框架属性。但为什么[button sizeToFit];不会产生任何结果仍然超出我的范围。如果我弄清楚了,如果我记得,我可能会发布它。

编辑:@ZevEisenberg 用这条评论钉住了它:“警告:如果变换属性不是恒等变换,那么这个属性的值是未定义的,因此应该被忽略。” 所以你在这里使用中心和边界是正确的,但如果你没有变换,框架是完全安全的。

下一个编辑:这是我最终重新定位按钮的方式:

-(CGPoint)centerForView:(UIView *)view{
    //calculate a suitableposition for the view
    //depending on the current orientation and the device type (iphone 4S/5, etc)
    return point;
}

然后,作为对 deviceOrientation 更改通知的反应,我将 CGAffineTransformIdentity 应用于所有视图,使用上面显示的 centerForView 重新定位它们,并将正确的旋转变换应用于视图。每次 div 旋转时,我都会对所有子视图执行此操作,如下所示:

-(void)setRightRotationTransformations{
[self resetAllTransformations];
self.someSubview.transform = CGAffineTransformRotate(self.someSubview.transform, -M_PI_2);
}
于 2013-07-05T09:34:32.063 回答
0

在我的情况下,这样的黑客行为:

  1. 将换行模式设置为Word Wrap
  2. 为标题添加额外的行(即使是一行标题)

在此处输入图像描述

于 2016-10-31T23:52:00.490 回答