您似乎是面向对象编程的新手(正如最后一部分所证明的那样),我强烈建议您阅读以下内容: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.
好吧,我希望这会有所帮助,我强烈建议您阅读面向对象的编程指南。