gpt4 book ai didi

ios - subview 的子层与更高的 subview 重叠

转载 作者:可可西里 更新时间:2023-11-01 05:28:11 28 4
gpt4 key购买 nike

我有一个问题:我正在创建一个从方法返回的 UIView,那部分没问题,但我注意到,当我向其中一个添加子层时 subview ,这些层与层次结构中更高层的 subview (textView 和 imageView)重叠 添加到 testViewCopy 的子层出现在这些 subview 之上,但它们不应该出现。我不知道这是怎么回事。

代码:

- (void)makeShareImages
{
UIView *shareView = [self shareView];

UIView *testViewCopy = [shareView viewWithTag:0];

NSUInteger currentIndex = 1;

for (NSDictionary *sub in self.array)
{
NSArray *lastArray = [sub objectForKey:@"LastArray"];

for (NSDictionary *dict in lastArray)
{
@autoreleasepool
{
currentIndex ++;

CircleLayer *layer = [[CircleLayer alloc]init];
layer.portrait = [[dict objectForKey:@"Portrait"]boolValue];

layer.frame = testViewCopy.bounds;

[testViewCopy.layer addSublayer:layer];

NSData *frameData = [self getSnapshotDataFromView:shareView];

NSString *savePath = [NSString stringWithFormat:@"%@/%lu.png",somePath,(unsigned long)currentIndex];

[frameData writeToFile:savePath options:0 error:nil];
}
}
}
}

- (UIView *)shareView
{
UIColor *bgColor = self.containerView.backgroundColor;

CGSize size = self.containerView.bounds.size;

UIView *viewToShare = [[UIView alloc]init];
viewToShare.backgroundColor = bgColor;
viewToShare.layer.cornerRadius = 6.0;
viewToShare.layer.masksToBounds = YES;

UIView *testViewCopy = [[UIView alloc]init];
testViewCopy.backgroundColor = [UIColor clearColor];
testViewCopy.contentMode = UIViewContentModeScaleAspectFit;
testViewCopy.layer.masksToBounds = YES;
testViewCopy.tag = 0;

UITextView *textViewCopy = [[UITextView alloc]init];
textViewCopy.backgroundColor = [UIColor clearColor];
textViewCopy.tag = 1;
textViewCopy.textContainerInset = self.textView.textContainerInset;

UIImageView *profileImageViewCopy = [[UIImageView alloc]initWithFrame:CGRectMake(2, 2, 32, 32)];
profileImageViewCopy.contentMode = UIViewContentModeScaleAspectFit;
profileImageViewCopy.layer.masksToBounds = YES;
profileImageViewCopy.image = [self profileImage];
profileImageViewCopy.tag = 2;
profileImageViewCopy.layer.cornerRadius = profileImageViewCopy.frame.size.width / 2.0;

viewToShare.frame = CGRectMake(0, 0, size.width, size.height);
testViewCopy.frame = CGRectMake(0, 0, size.width, size.width);
textViewCopy.frame = CGRectMake(0, 0, size.width, size.height);

NSAttributedString *attributedStringCopy = [[NSAttributedString alloc]initWithAttributedString:self.textView.attributedText];

textViewCopy.attributedText = attributedStringCopy;

[viewToShare addSubview:testViewCopy];
[viewToShare addSubview:textViewCopy];
[viewToShare addSubview:profileImageViewCopy];

return viewToShare;
}

- (NSData *)getSnapshotDataFromView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *snapShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return UIImagePNGRepresentation(snapShot);
}

最佳答案

您的代码运行正常。所有同级 View ——公共(public)父 View 的 subview ——都有明确的分层顺序,从后到前。 addSubview: 添加 subview 作为其兄弟 View 中的最后一个;因此,它位于同一父 View 的所有现有 subview 之前。如果这不是您想要的,请将 subview 从前面插入更远的层,或者添加它(在前面),然后按分层顺序将其进一步向后移动。

此外(在这里我认为我们正在接近您注意到的特定现象), View 本身只是层。因此, View 的分层顺序实际上是图层分层顺序的子集。我刚才所说的关于 View 的事情同样适用于层,因为 View 层:如果您将子层添加到超层,它会添加到该超层的所有其他子层之前,包括任何 subview 如果该超层实际上是一个 View 。

正如我在当前版本的书中所写:

A view's subview's underlying layer is a sublayer of that view's underlaying layer, just like any other sublayers of that view's underlying layer. Therefore, it can be positioned anywhere among them in the drawing order. The fact that a view can be interspersed among the sublayers of its superview's underlying layer is surprising to beginners.

enter image description here

听起来您刚刚发现了这一点,并且感到很惊讶。

从渲染树的绘制的角度,以活跃的方式来思考它可能会有所帮助。换句话说,与其考虑事物的外观,不如考虑 iOS 的作用。一个层可以有一个超层,除了最终的超层,一个层可以有一个 previous sibling ,除了超层的第一个子层。相反,一个层可以有子层,它可以有下一个兄弟。我们从绘制最终的超层(窗口)开始。然后,对于我们刚刚绘制的每一层,依次遵循以下两个规则:

  • 绘制它的第一个子层,如果有的话。

  • 绘制它的下一个兄弟,如果有的话。

每次我们绘制一个图层时,它都在我们之前绘制的一切之前。因此,超层的所有子层都出现在超层的前面,所有后来的 sibling (及其子层)都出现在所有 previous sibling 姐妹(及其子层)的前面。这会导致您在屏幕上看到的内容。

(但是,请注意,您拥有更大的灵 active ,因为在同级之间,您可以通过设置图层的 zPosition 属性来操纵绘制顺序,而无需重新排列同级。)

关于ios - subview 的子层与更高的 subview 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29950670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com