旋转 UIButton titleLabel 而不剪裁

Posted

技术标签:

【中文标题】旋转 UIButton titleLabel 而不剪裁【英文标题】:Rotate UIButton titleLabel without clipping 【发布时间】:2014-12-05 04:11:40 【问题描述】:

我正在尝试将 UIButton 的 titleLabel 旋转 45 度。文本中的字符是“+”。

我可以让标题旋转

button.titleLabel?.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_4))

然后“+”符号的一端被剪掉,如下图所示。

我找到了this,但我不太明白问题是如何解决的。奇怪的是,被剪裁的部分仍然存在于另一端的范围内——它没有突出到符号的“正方形”之外。

我还尝试使用 Facebook 的 Pop 库,这很有效,但我不知道如何进行正常的逆时针或顺时针旋转。我将kPOPLayerRotationM_PI_4 一起使用,它做了一些意想不到的事情。如果有人可以提供基本顺时针/逆时针旋转的示例代码,我很乐意使用 Pop。

一个可能相关的问题:titleLabel 的中心也会移动。有没有简单的方法可以防止这种情况发生?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

您正在旋转按钮的 titleLabel,它位于按钮内部。按钮未旋转。但标签被旋转了。所以你得到标签的剪辑或中心错位。我建议您旋转按钮本身。所以它也会旋转它的子视图。

// Check already it was rotated,transformed...?
if (CGAffineTransformIsIdentity(button.transform)) 

    //Yes, Reset to the original position and size.
    button.transform = CGAffineTransformIdentity;



//Apply rotation now
button.transform=CGAffineTransformMakeRotation(M_PI_4);

【讨论】:

感谢您的帮助。之后,如何重置按钮的框架,以便只有 titleLabel 旋转,而不是整个按钮?我尝试做button.bounds = CGRectMake(...),但这并没有解决它。 只需使用 button.transform = CGAffineTransformIdentity;然后设置按钮的框架。 我尝试做类似button.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_4)) 然后button.transform = CGAffineTransformIdentity 然后button.frame = CGRectMake(...) 之类的操作,但这没有效果(即整个按钮会旋转,然后旋转回来,但按钮的实际标题会回到它开始的地方——一个普通的“+”)。【参考方案2】:

对于将来会遇到此问题的任何人,我最终创建了一个新的 UIView(蓝色矩形),其中包含 UIButton(白色“+”)。然后我在 UIButton 上禁用了使用过的交互,并向 UIView 添加了一个手势识别器。当我想旋转“+”时,我旋转了整个 UIButton(但不是包含 UIView)。

【讨论】:

以上是关于旋转 UIButton titleLabel 而不剪裁的主要内容,如果未能解决你的问题,请参考以下文章

为 UIButton 设置 titleLabel

MvvmCross 绑定到 UIButton.TitleLabel.Text

更新 titleLabel UIButton

根据 titleLabel 的长度调整 UIButton 的大小

UIButton:根据titleLabel Text计算UIButton的高度

UIButton set titleLabel setValue(newLabel, forKeyPath: "titleLabel")