Objective-C之报错:Expression is not assignable.

本文介绍在Objective-C中如何实现UIButton点击后位置变化的效果。通过获取按钮的frame,改变其位置,并重新赋值来实现平滑移动。强调了Objective-C中结构体作为值类型而非引用类型的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开始着手计划在学习原生语言 Objective-C,一路上遇到的坑,我也会一一记录下来,都是一些踩坑的经验。因为总有那么一天,会有人因为看到我写的某篇技术博客,而受益良多。会更加激励自己不断前进。

在学习一个UIButton中附上背景图后,点击按钮移动位置的这个小demo中,代码附上:

- (IBAction)leftBtn {
    CGRect originFrame = self.img.frame;
    originFrame.origin.x -=10;
    self.img.frame = originFrame;
    
    NSLog(@"左");
}

比方这个向左的点击事件。首先拿到这个UIButton的img的frame。而这个frame是结构体CGRect类型,所以需要用CGReact 变量名存一下。然后进行origin(x/y)或者size(width/height)的变化。最后竟然还需要加一步:self.img.frame = originFrame.再赋值回去。

真的要是以我之前js的弱类型写法,就会直接写成:

self.img.frame.origin.x -=10; 

就会报错了,重点来了:


然而OC并不是这样,因为我们这个UIButton是OC对象;而当OC对象中的属性frame是结构体类型,修改结构体类型属性frame的时候,必须要先用结构体类型CGRect存储后,再进行赋值表达式计算;然后要再将计算好了的值重新赋值给self.img.frame. 

 结构体是值传递,不是地址传递。需要将值计算完成之后,再赋值到原来的对象frame中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值