iPhone: рисовать повернутый текст? - PullRequest
6 голосов
/ 10 ноября 2009

Я хочу нарисовать текст в виде, повернутый на 90 °. Я довольно новичок в разработке для iPhone, и поиск в Интернете открывает множество различных решений. Я пробовал несколько и обычно заканчивал тем, что мой текст был обрезан.

Что здесь происходит? Я рисую в довольно маленьком пространстве (ячейка табличного представления), но должен быть "правильный" способ сделать это ... верно?


Редактировать: Вот несколько примеров. Я пытаюсь отобразить текст " 12345 " вдоль черной полосы слева.

  1. Первая попытка, от RJShearman на Apple Обсуждения

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSelectFont (context, "Helvetica-Bold", 16.0, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode (context, kCGTextFill);
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
    CGContextSetTextMatrix (context, CGAffineTransformRotate(CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f ), M_PI/2));
    CGContextShowTextAtPoint (context, 21.0, 55.0, [_cell.number cStringUsingEncoding:NSUTF8StringEncoding], [_cell.number length]);
    CGContextRestoreGState(context);
    

    Attempt one. The one and part of the two are clipped out.
    (источник: deeptechinc.com )

  2. Вторая попытка, из zgombosi на iPhone Dev SDK . Идентичные результаты (здесь шрифт был немного меньше, поэтому отсечения меньше).

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGPoint point = CGPointMake(6.0, 50.0);
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, point.x, point.y);
    CGAffineTransform textTransform = CGAffineTransformMakeRotation(-1.57);
    CGContextConcatCTM(context, textTransform);
    CGContextTranslateCTM(context, -point.x, -point.y);
    [[UIColor redColor] set];
    [_cell.number drawAtPoint:point withFont:[UIFont fontWithName:@"Helvetica-Bold" size:14.0]];
    CGContextRestoreGState(context);
    

    Попытка два. Там практически идентичные отсечки http://dev.deeptechinc.com/sidney/share/iphonerotation/attempt2.png

Ответы [ 6 ]

7 голосов
/ 11 ноября 2009

Оказывается, что ячейка моей таблицы была всегда инициализирована высотой 44px независимо от высоты строки, поэтому весь мой рисунок был обрезан на 44px от вершины ячейки.

Чтобы нарисовать более крупные ячейки, необходимо было установить в представлении содержимого autoresizingMask с помощью

cellContentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

или

cellContentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

… и drawRect вызывается с правильным размером. В некотором смысле это имеет смысл, потому что UITableViewCell initWithStyle:reuseIdentifier: не упоминает размер ячейки, и только табличное представление фактически знает, насколько большой будет каждая строка, основываясь на ее собственном размере и ее размере. Ответ делегата на tableView:heightForRowAtIndexPath:.

Я читал Руководство по программированию Quartz 2D , пока модель и функции рисования не стали понятны, и код для рисования моего повернутого текста стал простым и очевидным:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextRotateCTM(context, -(M_PI/2));
[_cell.number drawAtPoint:CGPointMake(-57.0, 5.5) withFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]];
CGContextRestoreGState(context);

Спасибо за советы, похоже, у меня все готово.

3 голосов
/ 10 октября 2011

Использование: -

label.transform = CGAffineTransformMakeRotation(- 90.0f * M_PI / 180.0f);

где метка является объектом UILabel.

2 голосов
/ 10 ноября 2009

Вот совет. Я предполагаю, что вы делаете этот рисунок в drawRect. Почему бы вам не нарисовать рамку вокруг drawRect, чтобы увидеть, насколько велик прямоугольник, и если именно поэтому вы получаете отсечение.

В качестве альтернативы можно поместить текст в UILabel, а затем повернуть его на 90 градусов при создании ячеек в cellForRowAtIndexPath.

1 голос
/ 10 сентября 2015

к тому, что сказал @Sidnicious, и что я собрал через переполнение стека, я хочу привести пример использования - добавил мой код, чтобы полностью нарисовать линейку на левой стороне экрана с повернутыми числами:

ruler screenshot

RulerView : UIView


  // simple testing for iPhones (check for device descriptions to get all iPhones + iPads)
  - (float)getPPI
  {
      switch ((int)[UIScreen mainScreen].bounds.size.height) {
          case 568: // iPhone 5*
          case 667: // iPhone 6
              return 163.0;
              break;

          case 736: // iPhone 6+
              return 154.0;
              break;

          default:
              return -1.0;
              break;
      }
  }

  - (void)drawRect:(CGRect)rect
  {
      [[UIColor blackColor] setFill];


      float ppi = [self getPPI];

      if (ppi == -1.0)  // unable to draw, maybe an ipad.
          return;

      float linesDist = ppi/25.4; // ppi/mm per inch (regular size iPad would be 132.0, iPhone6+ 154.0)

      float linesWidthShort = 15.0;
      float linesWidthMid = 20.0;
      float linesWidthLong = 25.0;

      for (float i = 0, c = 0; i <= self.bounds.size.height; i = i + linesDist, c = c +1.0)
      {
          bool isMid = (int)c % 5 == 0;
          bool isLong = (int)c % 10 == 0;

          float linesWidth = isLong ? linesWidthLong : isMid ? linesWidthMid : linesWidthShort;
          UIRectFillUsingBlendMode( (CGRect){0, i, linesWidth, .5} , kCGBlendModeNormal);



          /*  FONT: Numbers without rotation (yes, is short)
          if (isLong && i > 0 && (int)c % 10 == 0)
              [[NSString stringWithFormat:@"%d", (int)(c/10)] drawAtPoint:(CGPoint){linesWidthLong +2, i -5} withAttributes:@{
                                                                                                                              NSFontAttributeName: [UIFont systemFontOfSize:9],
                                                                                                                              NSBaselineOffsetAttributeName: [NSNumber numberWithFloat:1.0]
                                                                                                                              }];
          */


          // FONT: Numbers with rotation (yes, requires more effort)
          if (isLong && i > 0 && (int)c % 10 == 0)
          {
              NSString *str = [NSString stringWithFormat:@"%d", (int)(c/10)];
              NSDictionary *attrs = @{
                                      NSFontAttributeName: [UIFont systemFontOfSize:9],
                                      NSBaselineOffsetAttributeName: [NSNumber numberWithFloat:0.0]
                                      };
              CGSize textSize = [str sizeWithAttributes:attrs];


              CGContextRef context = UIGraphicsGetCurrentContext();
              CGContextSaveGState(context);

              CGContextRotateCTM(context, +(M_PI/2));
              [str drawAtPoint:(CGPoint){i - (textSize.width/2), -(linesWidthLong + textSize.height +2)} withAttributes:attrs];

              CGContextRestoreGState(context);
          }

      }
  }
1 голос
/ 10 ноября 2009

Вы знаете о методе UITableViewDelegate heightForRowAtIndexPath верно?

Вот простое учебное пособие по различным методам графического уровня. Предполагая, что вы знаете, насколько велик ваш текст, вы должны иметь возможность соответственно изменять размер строки представления таблицы.

Кроме того, я бы проверил, чтобы границы после любого преобразования действительно соответствовали вашим ожиданиям. (Для проверки используйте либо отладчик, либо оператор журнала).

0 голосов
/ 07 апреля 2010

После того, как я обнаружил, что мне нужно добавить следующее в начало моего файла, мне понравился подход Мэтта. Очень просто.

#define degreesToRadian(x) (M_PI * (x) / 180.0)

предложение Махбоуда, вероятно, будет вашим путем наименьшего сопротивления. Вы можете повернуть UILabel на 90 градусов следующим образом: [label setTransform: CGAffineTransformMakeRotation (DegreesToRadians (-90.0f))]; Вам просто нужно рассчитать высоту вашей ячейки на основе ширины метки. -Матт - Мэтт Лонг 10 ноября в 0: 09

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...