【发布时间】:2014-03-24 17:38:50
【问题描述】:
我需要在表格视图单元格中设置地图视图的位置。我只是在 cellForRow 方法中设置了框架。
一些地图视图放错了位置。当我向上滚动表格并向下滚动以使其重新出现(以重用表格单元格)时,它就被修复了。
注意
y 位置错误但 x 位置正确。
我使用相同的方式(简单地设置框架)来设置图片位置,它们总是正确的。所以问题是地图视图本身而不是如何定位框架。
以下截图显示了 3 个地图视图,中间的 y 位置错误
编辑:
UI 部分相当复杂。在 cellForRowAtIndexPath 方法中,我将 MessageCell 出列并调用其 setupWithMessage:(Message *)message 方法,然后检查消息是否为位置类型:(位置类型消息具有可选的文本视图和地图视图)
self.textView.hidden = NO;
self.mapView.hidden = NO;
self.textView.text = message.text;
[Helper setupMapView:self.mapView posx:message.posx posy:message.posy];
CGSize size1 = [UIHelper sizeWithText:message.text entity:message];
CGSize size2 = [UIHelper sizeWithMapEntity:message];
CGRect frame = [UIHelper adjustTextView:self.textView textViewSize:size1 extraView:self.mapView extraViewSize:size2 entity:message];
+ (CGRect)adjustTextView:(UITextView *)textView textViewSize:(CGSize)textViewSize extraView:(UIView *)extraView extraViewSize:(CGSize)extraViewSize entity:(id)entity {
if (textView == nil || extraView == nil || CGSizeEqualToSize(textViewSize, CGSizeZero) || CGSizeEqualToSize(extraViewSize, CGSizeZero)) {
CGSize targetSize;
UIView *targetView;
if (textView == nil || CGSizeEqualToSize(textViewSize, CGSizeZero)) {
targetView = extraView;
targetSize = extraViewSize;
}
else {
targetView = textView;
targetSize = textViewSize;
}
return [self adjustContentView:targetView size:targetSize entity:entity];
}
else {
CGRect frame1 = [self adjustContentView:textView size:textViewSize entity:entity];
CGRect frame2 = [self adjustContentView:extraView size:extraViewSize entity:entity];
frame2.origin.y += frame1.size.height + OFFSET_BETWEEN_TEXTVIEW_EXTRAVIEW;
extraView.frame = frame2;
return CGRectMake(frame1.origin.x, frame1.origin.y, MAX(frame1.size.width, frame2.size.width), frame1.size.height + frame2.size.height + OFFSET_BETWEEN_TEXTVIEW_EXTRAVIEW);
}
请注意,上面的“extraView”可以指代文本视图下方的任何视图,例如 UIImageView
+ (CGRect)adjustContentView:(UIView *)contentView size:(CGSize) size entity:(id)entity {
float photoSideOffset = 60;
float topOffset = 30;
CGRect frame;
frame.origin.y = topOffset;
frame.size = size;
if ([DBHelper isMyEntity:entity]) {
frame.origin.x = 320 - size.width - photoSideOffset;
}
else {
frame.origin.x = photoSideOffset;
}
contentView.frame = frame;
if ([contentView isKindOfClass:[UITextView class]]) {
[(UITextView *)contentView sizeToFit];
}
return contentView.frame;
}
编辑 2:我对照片消息使用相同的 UIHelper 方法,并且坐标是正确的:
编辑 3:size1 size2 和 frame 的值
【问题讨论】:
-
你能把代码贴在你设置框架的地方吗?
-
您使用的是哪种 UITableViewCell?通常对于这样的事情,我会在情节提要上创建一个自定义单元格,创建 UItableViewCell 的子类并将所有内容链接在一起。例如,我为我工作以插入 PickerViews。
-
这是一个简单的视图复用问题。为了给你一个提示,请查看第一个单元格的可见部分和中间单元格的地图位置。如果您通过故事板或自定义视图使用它,请发布您的代码并告诉我们。
-
您的自动布局和自动调整大小蒙版的使用可能也有一些事情要做。你用的是哪一个?
-
@VinnyCoyne 我发布了代码
标签: ios iphone cocoa-touch uikit