首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在viewDidLoad之外,CGRect不能在闭包中工作

的原因是闭包中的代码是在后台线程中执行的,而不是在主线程中执行的。而CGRect是UIKit框架中的一个结构体,用于表示视图的位置和大小。UIKit框架是基于主线程的,因此在闭包中使用CGRect可能会导致线程不安全的问题。

为了解决这个问题,可以使用DispatchQueue.main.async将闭包中的代码切换到主线程中执行。这样就可以安全地使用CGRect了。具体的代码示例如下:

代码语言:txt
复制
DispatchQueue.main.async {
    // 在闭包中使用CGRect的代码
    let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
    // 其他操作...
}

在上述代码中,闭包中的代码会被切换到主线程中执行,确保了对CGRect的安全访问。

需要注意的是,除了CGRect之外,还有一些UIKit框架中的其他类和结构体也需要在主线程中使用,比如UIView、UILabel等。同样的,可以使用DispatchQueue.main.async来切换到主线程中执行相关代码。

在云计算领域中,与CGRect相关的概念可能是与图形处理相关的技术,比如图像识别、图像处理等。腾讯云提供了一系列与图像处理相关的产品和服务,例如腾讯云图像识别、腾讯云智能图像处理等。您可以通过访问腾讯云官方网站了解更多相关信息和产品介绍。

腾讯云图像识别产品介绍链接:https://cloud.tencent.com/product/imagerecognition 腾讯云智能图像处理产品介绍链接:https://cloud.tencent.com/product/imageprocessing

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

动画分析步骤“三步曲”

经过以上分析,大家应该清楚,动画起始阶段可以将所有的初始化代码放置viewDidLoad()方法。具体实现代码如下所示。...注意,这里animations是一个,使用的方式将动画代码追加进去。只需要将动画的结束状态设置完成,那么动画从开始到结束的中间过程,iOS都会自动实现。...frame.height)) }) } animate方法,duration表明动画执行周期为1s,动画部分表明登录按钮最终的位置,即最终停留在手机屏幕的中间位置。 3 ....登录按钮移动动画效果:方法形式 除了使用的方法之外,还可以使用另外一种方式实现这个动画效果,即通过commit相关方法的形式来实现。...frame是CGRect类型,它是一个结构体,结构体包含origin和size两个属性。

86310

用 Swift 实现轻量的属性监听系统

单独拿名字来说,除开在修改界面,可能在系统的其他界面也会使用到它,这就涉及到更新名字后再更新其他界面的问题。 你的第一直觉是什么呢?多半是使用通知,也就是 NSNotification。...SecondViewController 的代码类似 FirstViewController,赘述。...我们可以传递包给 UserInfo,它将存储起来,并在 name 被改变时调用这些,这样里的操作就会被执行了。自然,我们要在里更新 UI。...如果我们能为取名字,我们就能在第二次进入时用新的替换旧的,从而保证 nameListeners 的数量不会无限制的增长,也就不会浪费内存和 CPU 了。...") { name in self.nameButton.setTitle(name, forState: .Normal) } 我们只前面增加了一个的“名字”而已。

78130

Swift| 基础语法(四)

重写属性的Set、get发方法 ---- 一、 Swift 的概念就像是Objective-C的block。...OC的block类似于匿名函数,是用来定义函数, 同时可以嵌套和作为参数传递。 Swift ,函数也只不过是一种特殊的。...的循环引用问题 Swift开发,有一个原则就是能不写self就不写self,但是必须写上self; 这是因为是用来保存一段代码,而且系统也不知道这段代码具体的调用时间, 所以为了保证的对象不被释放...出TwoController, 我们TwoController中进行一些关于的操作,然后pop返回的时候查看该控制器是否被销毁了, 来验证是否发生了循环引用问题; TwoController...; 这是因为:控制器通过属性引用,而又强引用着self(控制器),所以导致了循环引用的问题; Swift关于循环引用的解决方案 weak var weakSelf = self 那么原先代码只需要把

1.4K10

【从零开始用Swift开发一个iOS应用(仿微博)】开篇-1. demo上手体验

// 1.创建一个视图 let v = UIView(frame: CGRect(x:0, y:0, width: 100, height: 100))...效果如下所示,图片会显示屏幕中间。 ?...当编译器提示的时候,再添加,会对语境有更好的机会; 原因:(类似于 OC block)需要使用self。 3.4 不需要; 除非多行代码语句写在同一行。...UIButtonType.ContactAdd 3.6 监听方法对比 Swift: #selector,如果带参数,不需要使用`:` OC: @selector 3.7 调试对比 Swift: print(xxx) 效率高,log包含时间...如下图所示,我注释添加了MARK、TODO、FIXME标签前缀,这些特殊标记的锚点菜单将会显示导航栏上,点击菜单即可跳转到对应注释的地方,非常方便。 ?

3.7K31

图层几何学 -- iOS Core Animation 系列二

视图的frame、bounds、center属性仅仅是存取方法,当操纵视图的frame时,实际上是改变视图对应的CALayer的frame, 不能独立于图层之外改变视图的frame....和系列一提到的contentsRect类似,anchorPoint用单位坐标来表示(默认情况是{0.5, 0.5})。可以通过指定x和y值小于0或者大于1,使它放置图层范围之外。...处理代码如下: // viewdidload添加 self.secondHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f); self.minuteHand.layer.anchorPoint...)convertRect:(CGRect)rect fromLayer:(CALayer *)layer; - (CGRect)convertRect:(CGRect)rect toLayer:(CALayer...首先我SB设置两个视图,如下图: ? 如果我们不做任何操作,运行后,两个视图显示的顺序就是我们现在设置的这样。

57830

Swift| 基础语法(五)

override func viewDidLoad() { super.viewDidLoad() title = "Tb 测试" myTb = UITableView.init...} Swift,创建tableViewCell的方法可以分为两种创建tableView时候注册和需要使用时手动创建。先聊聊创建tableView的时候直接注册cell: myTb?....register(MyNewTableViewCell.self, forCellReuseIdentifier: "myCell") 当注册了Cell之后,没有可重用的Cell时会自动创建,并且不能在需要时手动创建...可以自定义cell处理点击状态下的显示 var label1 :UILabel? var label2 :UILabel?...因为Swift,所有对象的构造器默认都是public,所以需要重写你的init让其成为私有的。 这样就保证像如下的代码编译报错,不能通过。 六、从相册选择照片或者拍照 ?

2K30

谈谈对drawRect的理解

默认情况下,该方法视图加载过程不做任何人处理。当子类使用Core Graphics和UIKit绘制视图内容时就需要在该方法添加绘制的代码。...这个是由系统自动调用的,主要是UIViewControllerloadView和viewDidLoad方法调用之后; 如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用...若使用UIView绘图,只能在drawRect:方法获取绘制视图的contextRef。...在其他方法获取的contextRef都是生效的; drawRect:方法不能手动调用,需要调用实例方法setNeedsDisplay或者setNeedsDisplayInRect,让系统自动调用该方法...; 若使用CALayer绘图,只能在drawInContext :绘制,或者delegate方法中进行绘制,然后调用setNeedDisplay方法实现最终的绘制; 若要实时画图,不能使用gestureRecognizer

1.7K20

iOS循环引用

iOS循环引用 当前类的/Block属性,用到了当前类,就会造成循环引用 此/Block应该是当前类的属性,我们经常对Block进行copy,copy到堆,以便后用。...Object-C Block循环引用情况 一般来说我们总会在设置Block之后,合适的时间回调Block,而希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy...swift 循环引用情况 class ViewController: UIViewController { // 1.是当前类属性 var allCallBack :(()->...override func viewDidLoad() { super.viewDidLoad() CyclicLead { /...view) } 方案二: 和方案一类型,只是书写方式更加简单 可以写在,并且中用到的self都是弱引用 CyclicLead {[weak self]()->() in

77350

UIKit Dynamics:开始入门 —《Graphics & Animation系列一》

准备开始 ViewController.swift 添加如下代码viewDidLoad: let square = UIView(frame: CGRect(x: 100, y: 100,...增加重力效果 仍然 ViewController.swiftviewDidLoad上方添加以下属性: var animtor: UIDynamicAnimator!...将以下代码插入viewDidLoad添加square的代码下面: let barrier = UIView(frame: CGRect(x: 0, y: 300, width: 130, height...到目前为止,UIKit Dynamics的功能已经变得相当清晰:只需几行代码就可以完成很多工作。 引擎盖下有很多事情要做, 下一节将向展示动态引擎如何与应用程序的对象交互的一些细节。...viewDidLoad,从square声明删除let关键字,以便它使用新属性而不是局部变量: square = UIView(frame: CGRect(x: 100, y: 100, width

1.8K30

iOS 仿支付宝银行卡界面(支持Swift和OC)

一:简介 在有支付相关的APP,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡页面该怎么实现呢?...为了实现相应的功能,仿照支付宝的银行卡卡开发出相应的页面,页面长这个样子: 二:说明目录 创建钱包视图容器WalletView 初始化WalletView并加载钱包头部视图walletHeader 钱包视图中重新加载卡片视图...钱包视图中实现添加卡片方法 展示页面我们可以看到,页面的左上角有一个添加按钮,这个按钮的UI布局头部视图中实现,具体的功能是,添加一个卡片,具体的实现方法如下: open func insert...CardView实现点击手势展示隐藏卡片 Demo实现在CardView中点击除了删除按钮外任何位置,都可以触发隐藏卡片的功能,这里是CardView添加了手势来实现该功能,代码如下: public...override func viewDidLoad() { super.viewDidLoad() } }

1.4K20

Core Animation实战二(寄宿图)

{ [super viewDidLoad]; // Do any additional setup after loading the view from its nib....imageLayer.contents = (__bridge id _Nullable)(image.CGImage); //contentsGravity的目的是为了决定内容图层的边界怎么对齐...,我们将使用kCAGravityResizeAspect,它的效果等同于UIViewContentModeScaleAspectFit, 同时它还能在图层中等比例拉伸以适应图层的边界。...imageLayer.contentsRect = CGRectMake(0, 0, 0.5, 0.5); //contentsCenter其实是一个CGRect,它定义了一个固定的边框和一个图层上可拉伸的区域...end Core Graphics绘制寄宿图      CALayer有一个可选的delegate属性,实现了CALayerDelegate协议,当CALayer需要一个内容特定的信息时,就会从协议请求

42030

Swift 内存管理详解

定义属性 var 或者 let 之前,添加 unowned 关键字即可。...当和捕获的对象总是相互引用,并且总是同事销毁时,应该将内捕获的实例定义为无主引用。       当捕获的引用变量有可能是 nil 时,将捕获的引用变量定义为弱引用。      ...如果程序将该对象本身传入了,那么本身就会捕获该对象,于是该对象就持有了属性,反过来,也持有对象,这样子就形成了强引用。...我们看在 viewdidload 方法,先创建了一个 teacher 对象,并且赋值给 tea 变量,接下来有定义了一个函数类型的变量,并且将 teacher 实例的 findteacher 属性赋值给该变量...,到后面tea 和 find 变量都赋值为 nil , 此时没有引用变量引用 teacher 对象和对象,但两个对象之间的相互引用就形成了强引用循环。

1.7K90
领券