您似乎是面向对象编程的新手(正如最后一部分所证明的那样),我强烈建议您阅读以下内容:Object-Oriented Programming with Objective-C
但我会回答你关于UIViews
. UIImageView
并且UILabel
都是该类的子UIView
类。 UIView
有一种特殊的变量,称为属性。这意味着该变量可以由另一个类在该类的实例上设置,然后也可以从其他类访问。 UIView
具有frame
包含视图轮廓的属性CGRect
。当你有一些代码时
ImageView *myImgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
您正在创建UIImageView
该类的一个实例,为其分配内存,并用一个框架对其进行初始化(在这种情况下,您使用的是高度和宽度为零的矩形,这有点没用)。为了将框架设置为有用的东西,您可以使用 format CGRectMake(originX, originY, width, height)
。请记住,在 iOS 上,原点位于视图的左上角,y 值越高,屏幕越靠下。如果您以后需要更改框架,而不是创建一个全新的实例,您可以简单地更改现有实例的属性:
myImgView.frame = CGRectMake(10, 20, 50, 100);
//this will make the frame of myImgView to a rectangel 10 units off of the right side of the view, 20 units down from the top of the view, and have a width of 50 units and a height of 100 units
但是,您已声明myImgView
为局部变量,这意味着您只能在声明它的函数中访问它,在您声明它时。为了随时随地访问它,您需要将其声明为Instance Variable,这意味着您在 .h 文件中声明它。
@interface MyView : UIView {
UIImageView *myImgView;
}
@end
然后该变量将可以在该类中的任何位置访问。正如我上面演示的那样改变它的框架将改变视图中的框架。
view
最后,如果您需要用它进行计算,您可以获得一个框架。例如,你可以得到这样的框架myImgView
:
CGRect viewFrame = myImgView.frame;
CGPoint origin = myImgView.frame.origin;
CGSize width = myImgView.frame.size;
float x = myImgView.frame.origin.x;
float height = myImgView.frame.size.height;
//I think you can get it from here
现在有了UILabels
,它可能有点棘手。UILabel 的框架不一定与文本占用的框架匹配。通常实际框架要小一些。为了获取 UILabel 文本的框架,请使用以下内容:
//UILabel *myLabel has been declared either in the .h or earlier in the function
CGRect textFrame = CGRectMake(myLabel.x, myLabel.y, [myLabel.text sizeWithFont:myLabel.font].width, [myLabel.text sizeWithFont:myLabel.font].height);
现在,最后,将它们放在一起,这将是如何为您的 计算新框架UIImageView
:
myImgView.frame = CGRectMake(myLabel.x + [myLabel.text sizeWithFont:myLabel.font].width, yOrigin, width , height);
//where myImgView is your UIImageView myLabel is your UILabel, yOrigin is the y value of the origin of the imageView, and width and height are the width and height of the image.
好吧,我希望这会有所帮助,我强烈建议您阅读面向对象的编程指南。