iOS中的-(CGRect*)帧方法是什么?
代码:iOS中的-(CGRect*)帧方法是什么?,ios,objective-c,uiview,uiviewcontroller,properties,Ios,Objective C,Uiview,Uiviewcontroller,Properties,代码: if (!CGRectContainsPoint([[viewArray objectAtIndex:0] frame], CGPointMake(newX, newY)) ) { .... } 问题: 我想在视图数组中获取UIView的“frame”值,所以我使用了以下方法: ((UIView *)[viewArray objectAtIndex:0]).frame 我使用(UIView*)强制将id对象转换为UIView,否则将触发类似“在类型为“id”的对象上找
if (!CGRectContainsPoint([[viewArray objectAtIndex:0] frame], CGPointMake(newX, newY)) )
{
....
}
((UIView *)[viewArray objectAtIndex:0]).frame
我使用(UIView*)强制将id对象转换为UIView,否则将触发类似“在类型为“id”的对象上找不到属性“frame”的错误”。但下面的方法似乎成功地避免了此错误:
[[viewArray objectAtIndex:0] frame]
那么[id frame]可以自动检测id的真实类型,然后让它调用该方法吗?
我真的很想知道这样的方法
[id frame]——id的实际类型是UIView
[id view]——id的实际类型是UIViewController
这些方法是getter方法还是setter方法?我看不出有什么不同,苹果公司的文件显示:
@property(nonatomic) CGRect frame
谢谢你的帮助 最后调用的方法是
-(CGRect)帧代码>。使用点语法只是objective-c编译器提供的一种语法糖。为了让这个糖起作用,编译器需要知道它使用的对象的类型
另一方面,objective-c使用消息传递来调用方法。这意味着当您使用语法[id message]
时,它将尝试在id
上执行选择器@selector(message)
id
是一种特殊类型,表示运行时的任何对象,它接受每个选择器,如果对象无法执行它,它将在运行时引发未知选择器异常。通过定义一个属性,如:@property(nonatomic)CGRect frame
该属性同时充当getter和setter
例如,要修改框架的宽度,可以编写:
CGRect frame = myView.frame;
frame.size.width = 100;
myView.frame = frame;
有关点表示法的详细说明,请参阅此页。读者,如果我错了,请纠正我。这是我对objective-c如何工作的理解,但我不想给OP错误的信息。当你说“为了让这糖工作…”时,我怀疑你是对的,但我想知道为什么它需要做的不仅仅是转换语法。