- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在我的 TableView 中绘制装饰 UITableViewCell 的文本横幅,看起来像邮票,斜跨单元格的左上角。
我可能完全在错误的地方做这件事,但我重写了 -layoutSubviews
来添加图层。我尝试在 -drawRect:
中执行此操作,但随着表格呈现,横幅最终被表格 View 的 imageView 覆盖(即图层位于 ImageView 下方,因为 ImageView 是稍后添加的)。
我真的很难为这个做正确的数学计算。我已经计算出,假设横幅从距单元格顶部 40 点和距左侧 40 点开始,角度恰好为 -45º,则斜边将为 56 点。所以我制作了一个 56 点宽的 CALayer,然后将它旋转 -45º,这样就可以了。问题在于牢房内的位置……它位于牢房外,而不是靠在牢房的边缘。
不是我通过反复试验将其放在正确的位置,有人可以帮我算算吗?显然,我需要移动图层并旋转它。
感觉这里我需要的是 anchorPoint,但这似乎实际上是在四处移动图层,所以我一定是漏掉了这个点(没有双关语的意思)。
- (void)layoutSubviews
{
[super layoutSubviews];
self.imageView.frame = CGRectMake(10, 10, 50, 50);
if (self.hasBanner) {
CALayer *banner = [CALayer layer];
banner.backgroundColor = [UIColor colorWithRed:.5f green:.5f blue:.5f alpha:1.f].CGColor;
banner.frame = CGRectMake(0, 40-15, 56, 15);
banner.anchorPoint = CGPointMake(0, 1); // this just makes it worse
banner.transform = CATransform3DMakeRotation(-45.0 / 180.0 * M_PI, 0.0, 0.0, 1.0);
[self.layer addSublayer:banner];
}
}
最佳答案
画个图:
我们可以走得更远,做一些触发,但让我们到此为止。很明显,横幅的中间顶部点应位于 (20,20)
。我们可以告诉 Core Animation 来做到这一点。
将其分为四个独立的步骤:
这些对应于四个属性:bounds
、anchorPoint
、position
和transform
。
您不想触及 frame
属性,因为它的值派生自 bounds
,position
、transform
和 anchorPoint
。如果您尝试设置 frame
,CALayer 将尝试反转 transform
,将其应用于您提供的矩形,然后设置 bounds
和位置
。这可能不会产生您想要的结果,所以您最好完全忽略它——那样不会造成混淆。
(有关更多信息,请参阅 Core Animation Guide,特别是 Layer Objects Define Their Own Geometry 部分。)
在代码中,我们将:
bounds
设置为矩形 0, 0, width, height
。 (我故意将 width
留给你——它必须大于 56。)anchorPoint
设置为点 0.5, 0
。换句话说,在层宽度的中间,在层的顶部。位置
设置为点20, 20
。transform
设置为旋转 45°。顺便说一句,在下面的代码中,我设置了 affineTransform
而不是 transform
,只是因为它对于简单的二维变换稍微方便一些。
您是正确的,-drawRect:
是创建和添加图层的错误位置。该方法应该绘制到 View 的内容(它的 CGContext
)中,但什么都不做。
layoutSubviews
可以工作,但它会比您预期的更频繁地被调用,并且您不希望每次都创建和添加一个新层。
看起来您只需要设置图层的几何形状一次,就再也不用碰它了。为什么不在 hasBanner
属性更改时创建或销毁图层?
@interface MyTableViewCell ()
@property (nonatomic) BOOL hasLayer;
@property (nonatomic) CALayer* bannerLayer;
@end
- (void)setHasBanner:(BOOL)hasBanner
{
if (hasBanner != _hasBanner) {
_hasBanner = hasBanner;
if (hasBanner) {
CALayer* banner = [CALayer layer];
banner.backgroundColor = [UIColor colorWithRed:.5f green:.5f blue:.5f alpha:1.f].CGColor;
banner.bounds = CGRectMake(0, 0, 56, 15);
banner.anchorPoint = CGPointMake(0.5, 0);
banner.position = CGPointMake(20, 20);
banner.affineTransform = CGAffineTransformMakeRotation(-45.0 / 180.0 * M_PI);
// Add the layer to the view, and remember it for later
[self.layer addSublayer:banner];
self.bannerLayer = banner;
} else {
// Remove the layer from the view, and discard it
[self.bannerLayer removeFromSuperlayer];
self.bannerLayer = nil;
}
}
}
关于iphone - 使用 CALayer 将对角线横幅/角标(Badge)添加到 UITableViewCell 的角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14669652/
我们可以使用GCM通知作为APNS徽章图标在iPhone应用程序上显示徽章编号吗 由于我无法使用GCM进行设置。 我推荐this link这说 Parameter Platform
注册推送通知时,我没有启用角标(Badge)警报... - (void)registerForPushNotifications { UIRemoteNotificationType noti
我向用户推送了一个没有角标(Badge)键或角标(Badge) = 0 的通知负载,通知无法从通知中心删除。这是我的有效负载: { "aps" : {"alert" : "bala bala
我想在用户每次打开应用程序时清除应用程序图标角标(Badge)。在我的应用程序中,我使用以下代码清除角标(Badge): [UIApplication sharedApplication].appli
在第二版中我可以使用 badge badge-important 我发现 .badge 元素不再具有上下文(-success、-primary 等)类。 如何在版本 3 中实现同样的效果? 例如。我希
Yii2 Twitter Bootstrap 徽章 颜色不变。 In browser source i cant find badge-success, badge-danger e.t.cclass
我目前正在设计一个教育网站。 为此,我们需要根据用户的事件(例如stackoverflow)为他们分配一些徽章。 我正在为此寻找框架。任何人都有任何想法,如何做到这一点? table 设计等 我可以想
我正在制作一个应用程序,该程序显示自从两个人建立关系以来的天数。我想在应用程序图标徽章上显示天数。我知道一旦用户离开应用程序该怎么做,但是我想每天更新图标徽章,即使该应用程序未在后台打开或在后台运行也
我是 iPhone开发的新手。我只是创建像聊天应用程序之类的应用程序。很简单,我使用JSON解析方法,并通过PHP从服务器调用数据并将其发送回给他们。 所以我有一个UIButton我想在此上设置徽章U
我想在控制SplitView中弹出框的UIBarButtonItem上添加徽章 这段代码什么都不做: - (void)splitViewController: (UISplitViewControll
也许这是一个简单的问题... 我有一个带有3个ViewController的3个选项卡栏项的UITabBarController。 我能够将Badge(通过使用setBadgeValue)添加到选项卡
我正在开发 react-native iOS 中的聊天应用程序。我想在收到通知、应用程序被杀死或用户强制退出时在主应用程序图标上进行标记增量。当应用程序处于后台模式时,它运行良好。但是 didRece
当我收到消息时,我会将用户名和未读消息计数写入 CoreData。并借助此功能: func unreadMessagesCountBadge(cell: onlineUserCell, forCoun
这是我的代码,我将日期放在应用程序角标(Badge)中。我想知道如何每天重新加载这个号码而不进入应用程序重新加载它。提前致谢! NSDate *today = [NSDate date]; NSCal
我有一个带有标签栏 Controller 的应用程序。这些 View 之一是 TableView 。有一种方法可以在标签栏中设置此 View 的角标(Badge)。这有效......但只有当用户触摸此
在我的数据库中,我将传递的消息计数存储在一个表字段中。对于我发送到特定设备的每条消息,我都会增加这个值。 当设备收到带有角标(Badge)设置的 payloa 时,它会在应用程序图标上显示红色圆圈。
我的应用程序包含许多嵌入式练习,这些练习会在应用程序使用期间显示给用户。我计划发布我的应用程序的定期更新,其中包含额外的练习。每次(标准应用程序商店应用程序)更新后,我想在应用程序图标上添加一个角标(
我试图了解当用户的网络连接特别差或没有网络连接时,iOS 上远程通知的最佳实践。 场景是这样的: 用户会收到一些远程通知,并在将来的某个时候打开应用程序。此时,我不想让服务器尽快知道角标(Badge)
我有一个函数,可以在单元格上添加角标(Badge): unreadMessagesCountBadge(cell, forCount: messagesCount) 但我不知道,如何检测我需要添加此角
我的问题的根源是我无法在真实设备上测试推送消息,因为这个问题似乎是 Xcode bug,但这不是现在的主题。我只是添加这个来回答为什么我不能正常测试我的实现。 因此,我使用 OneSignal SDK
我是一名优秀的程序员,十分优秀!