我正在开发一款iOS-6应用。我有一个UIViewController,其视图需要固定方向(纵向模式)。但是当手机旋转时,需要移动和旋转该视图上的一个控件(这样它将始终位于左上角,并且其文本将是可读的)。我通过使用我的控件的frame-property(它是一个自定义视图,稍后更多)转移控件(一个UIView)来实现这一点,然后使用CGAffineTRansformMakeRotate(),因为我知道它不建议使用旋转视图后的帧。到目前为止一切都很好,但事情就是这样:自定义视图有三个类型为UIButtonTypeCustom的UIButton作为其子视图。因为我旋转了视图,但是无法旋转视图内的按钮(它们不是正方形),我需要旋转按钮的titleLabel,使文本在新的deviceOrientation中可读。但它不会很好地工作。文本将按照我的意图旋转,但它将被titleLabel剪切,因为titleLabel的框架错误。我通过在标签上应用边框来检查这一点。所以我需要更改titleLabels框架,对吧?但我怎么能这样做?我尝试使用[titleLabel setFrame: frameThatFits];
进行设置,但无济于事。 (frameThatFits是我创建的CGRect)。另外,调用[button.titleLabel sizeToFit];
没有影响,我可以看到。
我正在使用[button setTitle:title forControlState: UIControlStateNormal];
来设置标题。
TL; DR :我试图在使用仿射变换旋转它之后更改UIButtons titleLabel的帧/边界。有帮助吗? 感谢。
PS:我可以在需要时提供代码,但我不知道该向您展示什么。告诉我你需要什么,生病了。
答案 0 :(得分:0)
好的,首先,感谢所有试图提供帮助的人。我为我的问题发布了一个替代解决方案,虽然它并没有真正解决更改titleLabels维度的问题,但它将导致我的ViewController的正确显示。
事实证明使用框架是一个坏主意。我最初使用框架重新定位视图,我认为这不是一个问题,因为我之后只是应用过转换,但我错了。因为显然我试图改变titleLabels框架。旋转之后。那不起作用。
因此,这里的方法是在整个代码中始终使用center-property和视图的bouds。这将导致正确旋转的按钮,之后不需要任何烦躁。
我的意思是,我永远不会再使用NSLog语句之外的frame-property。但为什么[button sizeToFit];
不会产生任何结果仍然超出我的范围。如果我弄明白的话,如果我记得的话,我可能会发布它。
编辑: @ZevEisenberg用这个评论钉了它: “警告:如果transform属性不是identity变换,则此属性的值是未定义的,因此应该被忽略。”所以你在这里使用中心和边界是正确的,但是如果你没有变换,那么框架就是是非常安全的。
下一页编辑: 继承人我最终如何重新定位按钮:
-(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重新定位它们,并将正确的旋转变换应用于视图。每次设备旋转时,我都会为所有子视图执行此操作,如下所示:
-(void)setRightRotationTransformations{
[self resetAllTransformations];
self.someSubview.transform = CGAffineTransformRotate(self.someSubview.transform, -M_PI_2);
}
答案 1 :(得分:0)