如何在Objective-C中为UIButton和UILabel旋转文本?

70

如何为UIButtonUILabel旋转文本?可以进行90度或180度的旋转。


你只是想旋转文本还是整个标签/按钮? - NIKHIL
7个回答

168
[*yourlabelname* setTransform:CGAffineTransformMakeRotation(-M_PI / 2)];

旋转的图像 enter image description here

之前的图像 enter image description here


7
只是一个小评论;除了M_PI之外,您还可以使用M_PI_2 (pi / 2)和M_PI_4 (pi / 4),因此您可以使用它们。 - Gabi Purcaru

33

试试这个:

lbl.transform= CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(270));

13
#define DEGREES_TO_RADIANS(x) (M_PI * x / 180.0)这段代码的作用是将角度值转换为弧度值。其中,x代表角度值,M_PI表示圆周率π,180.0表示180度。 - 3lvis
6
CGAffineTransformMakeRotation(- M_PI_2); - Denis

11

我想提供另一种选择。

与其旋转UILabel,你可以通过从UILabel中派生出一个子类并重写drawRect来旋转标签内的文本。如果你使用Interface Builder,你可以在Identity Inspector的Custom Class属性中指定此子类而不是UILabel。这将允许你使用XIB构建UI,而不是通过编程创建标签。唯一需要注意的是,在Interface Builder中的文本将水平显示,但在应用程序本身中将垂直呈现。

#import "RotatedLabel.h"

@implementation RotatedLabel

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSaveGState(context);
    CGContextRotateCTM(context, -(M_PI/2));

    UIFont* systemFont17 = [UIFont systemFontOfSize:17.0];
    CGSize textSize = [self.text sizeWithFont:systemFont17];
    CGFloat middle = (self.bounds.size.width - textSize.height) / 2;

    [self.text drawAtPoint:CGPointMake(-self.bounds.size.height, middle) withFont:systemFont17];

    CGContextRestoreGState(context);
}

@end

尝试旋转按钮内部的标签会导致标签非常短,例如,如果按钮只有标签的“高度”那么“宽度”。将变换应用于UIButton而不是按钮的标签,将同时旋转按钮和标签。 - Matt

4
你需要这样做:
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 50, 70)];

label.numberOfLines = 2;

label.text = @"text";

label.backgroundColor = [UIColor clearColor];

label.textColor = [UIColor whiteColor];


label.highlightedTextColor = [UIColor blackColor];

label.textAlignment = UITextAlignmentLeft;

label.font = [UIFont systemFontOfSize:12];



//rotate label in 45 degrees

label.transform = CGAffineTransformMakeRotation( M_PI/4 );


[self addSubview:label]; 
[label release];

我可以在NSString中使用CGAffineTransformMakeRotation吗? - Oleg
也许将它们结合起来会有意义...但是你有任何实现的想法吗? - Oleg
2
由于某种奇怪的原因,当我使用M_PI/4时,标签会消失。 - mskw

3

根据我的经验,在应用变换后,UIView的框架会发生变化,因此我使用了以下代码:

    UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(x, 0, 28, 159)];
    l.textAlignment = NSTextAlignmentRight;
    l.text = @"Hello!";

    [_viewXAxisLabels addSubview:l];
    [l setTransform:CGAffineTransformMakeRotation(-M_PI / 2)];
    l.frame = CGRectMake(x, 0, 28, 159);

1
//Right To Left
lable.transform = CGAffineTransformMakeRotation (3.14/2);

//Left To Right
[lable setTransform:CGAffineTransformMakeRotation(-M_PI / 2)];

或者

lable.transform= CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(270));

1
lbl.transform=CGAffineTransformMakeRotation(M_PI);

//Go back 

lbl.transform=CGAffineTransformMakeRotation(0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接