У меня есть следующая функция, которую я использую для пользовательской ячейки в 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)
}
}
Есть идеи, что здесь происходит или как я могу это исправить? Спасибо