DrawRect UIView не вызывается - PullRequest
1 голос
/ 19 июля 2011

Я пытаюсь отобразить горизонтальные и / или вертикальные линии в сетке. Поэтому я создал UIView подкласс GridLines, который рисует линии в drawRect:. Затем я создаю два из них (один вертикальный, а другой нет) и добавляю их в качестве подпредставлений в мой основной вид (Canvas), также полученный на UIView. Другие пользовательские подпредставления, которые я добавляю в Canvas, отображаются, удаляются и т. Д. Правильно, но объекты GridLines - нет, и их drawRect: никогда не вызывается. Когда у меня был этот код рисования линий в [Canvas drawRect:] (который теперь отключен), он правильно отображал сетку.

Просматривая похожие вопросы, кажется, что большинство людей с этой проблемой вызывают drawRect в классе, не производном UIView, но у меня UIView.

Я что-то здесь упускаю?

GridLines.h:

#import <UIKit/UIKit.h>
@interface GridLines : UIView
{
  BOOL mVertical;
}
- (id) initWithFrame: (CGRect) _frame vertical: (BOOL) _vertical;
@end

GridLines.m:

#import "GridLines.h"
@implementation GridLines
- (id) initWithFrame: (CGRect) _frame vertical: (BOOL) _vertical
{
  if ((self = [super initWithFrame: _frame]))
  {
    mVertical = _vertical;
  }

  return self;
}

- (void) drawRect: (CGRect) _rect
{
  NSLog(@"[GridLines drawRect]");
  CGContextRef context = UIGraphicsGetCurrentContext();
  [[UIColor clearColor] set];
  UIRectFill([self bounds]);

  if (mVertical)
  {
    for (int i = 50; i < self.frame.size.width; i += 50)
    {
      CGContextBeginPath(context);
      CGContextMoveToPoint(context, (CGFloat)i, 0.0);
      CGContextAddLineToPoint(context, (CGFloat)i, self.frame.size.height);
      [[UIColor grayColor] setStroke];
      CGContextSetLineWidth(context, 1.0);
      CGContextDrawPath(context, kCGPathFillStroke);
    }
  }
  else
  {
    for (int j = 50; j < self.frame.size.height; j += 50)
    {
      CGContextBeginPath(context);
      CGContextMoveToPoint(context, 0.0, (CGFloat)j);
      CGContextAddLineToPoint(context, self.frame.size.width, (CGFloat)j);
      [[UIColor grayColor] setStroke];
      CGContextSetLineWidth(context, 1.0);
      CGContextDrawPath(context, kCGPathFillStroke);
    }
  }
}
@end

В другом производном классе UIView:

- (void) createGrids
{
  mHorizontalLines = [[GridLines alloc] initWithFrame: self.frame vertical: NO];
  mVerticalLines   = [[GridLines alloc] initWithFrame: self.frame vertical: YES];
  [self addSubview: mHorizontalLines];
  [self addSubview: mVerticalLines];
}

1 Ответ

1 голос
/ 19 июля 2011

У вас может быть проблема frame v bounds.

mHorizontalLines = [[GridLines alloc] initWithFrame: self.frame vertical: NO];
mVerticalLines   = [[GridLines alloc] initWithFrame: self.frame vertical: YES];

frame сохраняется в координатном пространстве суперпредставления, если self.frame смещено больше, чем широко, когда вы устанавливаете эти новыепри просмотре этого кадра они будут обрезаны до прямоугольника self.

, попробуйте изменить его на self.bounds, который должен иметь origin = {0,0}

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