【问题标题】:UIImageView Bounds, FrameUIImageView 边界,框架
【发布时间】:2014-03-15 13:28:24
【问题描述】:

我知道这里有很多类似的问题,我检查了著名的问题,然后掌握了 Bounds 和 Frame 之间的区别。

现在我遇到了一些与它们相关的问题。我和他们一起玩,但它并没有像我预期的那样显示。

这里我不明白的是:

  • 为什么即使我将 UIImageView 设置在左下角,Y 的框架原点也是顶部下方 44.000000? 因为界限应该是 “UIView 的边界是矩形,表示为相对于其自身坐标系 (0,0) 的位置 (x,y) 和大小 (width,height)。” (Cocoa: What's the difference between the frame and the bounds?) 我认为框架也应该从这里的左角开始。

#import "ViewController.h"

@interface ViewController ()

//@property (weak, nonatomic) IBOutlet UIImageView *image;
@property (weak, nonatomic) IBOutlet UIImageView *image2;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


//UIImage *imageView = [UIImage imageNamed:@"stanford"];

//    self.image.alpha = 1;
//    self.image.contentMode = 1;
//    self.image.image = imageView;
//    [self.image setAlpha:0.1];
//    [self.image setContentMode:UIViewContentModeCenter];
//    [self.image setImage:imageView];



    NSURL *url = [[NSURL alloc] initWithString:@"http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Pitbull_2%2C_2012.jpg/472px-Pitbull_2%2C_2012.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *imageData = [UIImage imageWithData:data];

    [self.image2 setBounds:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.image2 setImage:imageData];

    NSLog(@"frame.orign.x:%f,frame.origin.y:%f",self.image2.frame.origin.x,self.image2.frame.origin.y);







}

【问题讨论】:

  • 我将 iPhone 视网膜设置为 4inch ,它可以工作,但我仍然不知道为什么 setBounds 方法不能正常工作。

标签: ios objective-c uiimageview frame bounds


【解决方案1】:

44 魔法数值实际上来自导航栏:) 而状态栏的高度是20 点。

如果您希望图像覆盖整个屏幕,那么您需要去掉状态栏,或者使状态栏半透明,以便在下方显示内容。

如果您没有将状态栏/导航栏设置为半透明,那么原点 0,0 将在您现在所体验的状态栏下方开始。

状态栏设置使用

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent];

导航栏,如果你有一个显示可以用这个来设置

theNavigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;

只有这样,您的以下代码才会全屏显示您的内容

[self.image2 setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]

这是因为将条形设置为半透明会使它们显示为叠加层。

【讨论】:

  • 非常感谢,好吧我这里不用导航栏,但是状态栏是默认设置的?我尝试了没有你给我的半透明方法的 [setFrame:] 方法,它也显示为覆盖。它是如何工作的?我很困惑:(谢谢,
  • @Toshi Lol,它是否解决了您的问题?之所以可行,是因为据我所知,默认情况下状态栏会导致原点偏移,而将状态栏设置为半透明将导致原点与状态完全一致条被绘制。因此,这将导致状态栏被绘制在顶部,作为您内容的覆盖。
  • 非常感谢。好的,所以设置半透明基本上意味着改变原点。如果勾选了半透明,则屏幕由状态栏/导航栏显示在上方,并且原点也向上更改,然后屏幕顶部隐藏,除非我们不隐藏状态栏/导航栏??跨度>
  • 当您设置状态栏或导航栏的半透明时,原点会自动更新。您应该考虑的方式是,如果您将导航/状态栏设置为半透明,那么您实际上是在说可以将您的内容绘制在导航栏下方而不是在其下方绘制。看看你 iOS 设备上的 Gallery 应用,你会发现导航栏和状态栏都被设置为半透明,这样图片内容就可以占据屏幕的全部容量,从而提供最大的屏幕空间
  • 我真的很感激!!!现在我很好地理解了这个概念。顺便说一句,我正在研究 UIWebView 并且有一些问题。我认为这个概念也适用于它,但它的显示方式不同。好吧,我在这里发布问题:stackoverflow.com/questions/21828333/…,但还没有得到答案。请您检查一下好吗?
【解决方案2】:

44 来自占据了这么多高度的导航栏

【讨论】:

  • 还有一个问题,如何设置 self.image2 setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];反而?那应该覆盖整个屏幕,为什么不覆盖状态栏?
  • @toshi Pavan 在这里,要回答您的两个问题,您可以查看我的回答以了解发生了什么。 :) 包括为什么您的内容没有覆盖状态栏
  • 嘿山姆,请注意,我认为 44 值可能是导航栏。
  • @pavan:感谢您的帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
相关资源
最近更新 更多