Представление изображения имеет размер 0x0, невозможно установить с помощью CGContextFillRect, пока не прокрутится и не прокрутится назад. - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующая функция, которую я использую для пользовательской ячейки в UITableViewCell.

При начальной загрузке ячейки, когда я устанавливаю установщик groupMessage на ячейку, эта функция в конечном итоге вызывается глубоко в недрах моего приложения, я получаю ошибку:

[Неизвестное имя процесса] CGContextFillRects: недопустимый контекст 0x0. Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.

Когда я прокручиваю и прокручиваю назад, эта функция работает нормально, и UIImageView настроен правильно с его текстом.

- (UIImage *)imageSnapshotFromText:(NSString *)text backgroundColor:(UIColor *)color circular:(BOOL)isCircular textAttributes:(NSDictionary *)textAttributes {

    CGFloat scale = [UIScreen mainScreen].scale;

    CGSize size = self.bounds.size;
    if (self.contentMode == UIViewContentModeScaleToFill ||
        self.contentMode == UIViewContentModeScaleAspectFill ||
        self.contentMode == UIViewContentModeScaleAspectFit ||
        self.contentMode == UIViewContentModeRedraw)
    {
        size.width = floorf(size.width * scale) / scale;
        size.height = floorf(size.height * scale) / scale;
    }

    UIGraphicsBeginImageContextWithOptions(size, NO, scale);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (isCircular) {
        //
        // Clip context to a circle
        //
        CGPathRef path = CGPathCreateWithEllipseInRect(self.bounds, NULL);
        CGContextAddPath(context, path);
        CGContextClip(context);
        CGPathRelease(path);
    }

    //
    // Fill background of context
    //
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));

    //
    // Draw text in the context
    //
    CGSize textSize = [text sizeWithAttributes:textAttributes];
    CGRect bounds = self.bounds;

    [text drawInRect:CGRectMake(bounds.size.width/2 - textSize.width/2,
                                bounds.size.height/2 - textSize.height/2,
                                textSize.width,
                                textSize.height)
      withAttributes:textAttributes];

    UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return snapshot;
}

В ячейке init я устанавливаю размер изображения:

let profileImageView = PFImageView()
profileImageView.layer.cornerRadius = 25        
profileImageView.clipsToBounds = true
profileImageView.isHidden = true
addSubview(profileImageView)
constrain(profileImageView) {
   $0.width == CGFloat(50)
   $0.height == CGFloat(50)
   $0.bottom == $0.superview!.bottom - CGFloat(8)
   $0.left == $0.superview!.left + CGFloat(12)
}
self.profileImageView = profileImageView

Вот как я изначально установил

            let cell = tableView.dequeueReusableCell(withIdentifier: "GroupMessageCell") as! GroupMessageCell
            cell.groupMessage = message <- *initial set happens in here, see code below in next block*
            cell.delegate = self

            var superSetter: (isFirstMessage: Bool, isLastMessage: Bool, admin: Bool) = (false, false, false)

            // Determine if first message
            var beforeSenderId: String? = nil
            if indexPath.row - 1 >= 0 {
                beforeSenderId = viewModel.messages[indexPath.row - 1].senderUserId
            }

            if let beforeId = beforeSenderId {
                superSetter.isFirstMessage = beforeId == message.senderUserId ? false : true
            } else {
                superSetter.isFirstMessage = true
            }

            // Determine if last message
            var afterSenderId: String? = nil
            if indexPath.row + 1 <= viewModel.messages.count - 1 {
                afterSenderId = viewModel.messages[indexPath.row + 1].senderUserId
            }

            if let afterId = afterSenderId {
                superSetter.isLastMessage = afterId == message.senderUserId ? false : true
            }

            superSetter.admin = viewModel.groupConvo.meta.adminIds.contains(message.senderUserId)

            // [a*, a, b] show pic
            // [a, a*, b], show username text
            // [a*, b], show pic and username text
            cell.superSetter = superSetter

            if superSetter.isFirstMessage {
                if let tuple = userProfilePictureMap[message.senderUserId] {
                    cell.setImage(withFile: tuple.file)
                } else {
                    message.senderUser.fetchIfNeededInBackground { [weak self] senderUser, error in
                        if let senderUser = senderUser as? PFUser {
                            self?.userProfilePictureMap[message.senderUserId] = (senderUser.object(forKey: "picture"), true)
                        } else {
                            self?.userProfilePictureMap[message.senderUserId] = (nil, true)
                        }
                    }
                }
            }

            // Cells must inherit the table view's transform
            // This is very important, since the main table view may be inverted
            cell.transform = tableView.transform

            return cell

И мой сеттер в клетке:

var groupMessage: GroupMessage? {
        didSet {
            guard let groupMessage = groupMessage else { return }

            // set the default
            profileImageView?.setImage(withFile: nil, defaultText: groupMessage.senderUsername)
        }
    }

Есть идеи, что здесь происходит или как я могу это исправить? Спасибо

...