- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个问题:我正在创建一个从方法返回的 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.
听起来您刚刚发现了这一点,并且感到很惊讶。
从渲染树的绘制的角度,以活跃的方式来思考它可能会有所帮助。换句话说,与其考虑事物的外观,不如考虑 iOS 的作用。一个层可以有一个超层,除了最终的超层,一个层可以有一个 previous sibling ,除了超层的第一个子层。相反,一个层可以有子层,它可以有下一个兄弟。我们从绘制最终的超层(窗口)开始。然后,对于我们刚刚绘制的每一层,依次遵循以下两个规则:
绘制它的第一个子层,如果有的话。
绘制它的下一个兄弟,如果有的话。
每次我们绘制一个图层时,它都在我们之前绘制的一切之前。因此,超层的所有子层都出现在超层的前面,所有后来的 sibling (及其子层)都出现在所有 previous sibling 姐妹(及其子层)的前面。这会导致您在屏幕上看到的内容。
(但是,请注意,您拥有更大的灵 active ,因为在同级之间,您可以通过设置图层的 zPosition
属性来操纵绘制顺序,而无需重新排列同级。)
关于ios - subview 的子层与更高的 subview 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29950670/
我有一个 DIV #page,如果我在顶部添加边距,突然出现一个滚动条,即使该元素不大于主体。我怎样才能去掉滚动条? (参见 Fiddle) 我的 HTML I am a div siz
function getClosestValue(standardArray, targetVal) { standardArray = standardArray.sort(function(a,
我有 318x424 的书籍封面图片,我想做的是指定一张图片,并在其下方添加一个文本链接。初始 src 是 about:blank,这样如果响应式设计不显示框架,它就不会占用用户带宽。 框架的 HTM
我被这个问题困了两天了,还是没搞定。 基本上,我有一个二维数组,其中包含某些数字(在给定范围内)之间的关系: 0 = 顺序无关紧要 1 = 第一个数字(左栏中的数字)应该是第一个 2 = 第二个数字(
只有当我在更高的 API 上进行调试时,我才会强制关闭脚本:16,但是当涉及到 API 时它工作正常:10。这可能是我的项目设置问题吗? 这是对服务器的简单请求,以获取 fragment 中的类别列表
给定下表books id | listorder ----+----------- 3 | 1 2 | 2 1 | 3 4 |
我想要那个密码切换功能,好像TextInputLayout有这个功能,而不是 TextInputEditText .但是正如您在下面的代码中看到的,即使我将高度设置为 wrap_content和 ap
似乎从 读取给出空列表,它主要发生在延迟较高的网络上的主机上。是否有更强大的与远程主机交互的方式? use Net::SSH2; # my $ssh = Net::SSH2->new(); # ..
为了在 Play 商店中发布我的应用程序,我必须将 TargetSdkVersion 从 23 更改为 26。在我更改它之前,该应用程序运行良好!现在应用程序在启动时崩溃。我想通了,问题出在这两行:
我尝试了很多解决方案,但找不到一个。我有 3 个不同的列,其中包含不同类型的文本,我需要它们具有相同的高度。但它们是这样不同的:colums有人可以帮忙吗? 代码: .col-sm-2{
我尝试将一个 div 相对于其具有负顶值的父级定位。这工作正常,现在的问题是这个 div,即使它有一个负的 top 值也会使父 div 更大。 我该怎么做才能让父 div 不那么大? Here's a
这是一个一般性问题,可能适用于任何给定的语言,如 C、C++、Java 等。 我认为无论以何种方式实现它,都不会比使用 2 个循环更高效,后者的效率为 n^2。 for(i=0;i O(1) ),要么
我需要查找所有有订单的家庭。我根本不关心订单的数据,只关心它的存在。 (使用 SQL Server) 这样说是不是更有效率: SELECT HouseholdID, LastName, FirstNa
我有一个 UINavigationController,在屏幕顶部有一个 UINavigationBar,在底部有一个 UIToolbar。我想让工具栏高一点。这是我的代码: CGRect toolb
我正在使用自定义字体。该字体在我的 Windows PC 上完美运行,但在我的 Mac (Yosemite OSX) 上运行不佳。正如您在图片中看到的,Mac 上的字体比 Windows 上的字体稍大
我正在尝试使用 FaSTLane 将我的应用程序作为 alpha 版本部署到 Play 商店,但出现此错误: Google Api 错误:multiApkShadowedActiveApk:任何设备都
我在这里找不到神奇的调味料。看起来 API 不支持它,所以我想我正在寻找一些 CSS 来使 slider 更大。 我得到的是左边的,但我想把它设计成右边的样子?任何 CSS 技巧或以前有人这样做过。
如果我运行这段代码: float a=1.123456789; printf("The float value is %f\n",a); double b=1.123456789876543 prin
我正在尝试使用 strip binary 来剥离我的目标文件。我在 gcc-7 上构建了最新的 binutils,但我的代码库使用 gcc-4.9.2。Binutils 是为 64 位架构构建的,我的
有没有办法让 iPhone 应用的“内容”区域感知到更大的导航栏? 类似这些问题: iOS: Adding a fixed image just below the navigation bar iO
我是一名优秀的程序员,十分优秀!