【问题标题】:centering a CGRect in a view在视图中居中 CGRect
【发布时间】:2010-09-09 15:53:13
【问题描述】:

我有一个图像显示在 CGRect 中。如何在视图中居中矩形?

这是我的代码:

UIImage * image = [UIImage imageNamed:place.image];
CGRect rect = CGRectMake(10.0f, 90.0f, image.size.width, image.size.height);

UIImageView * imageView = [[UIImageView alloc] initWithFrame:rect];
[imageView setImage:image];

我试过 imageView.center 但没有效果。

提前致谢。

【问题讨论】:

    标签: iphone objective-c uiimage


    【解决方案1】:

    看着:

    https://developer.apple.com/documentation/coregraphics/cggeometry

    你可以这样做:

    CGPoint center = CGPointMake(CGRectGetMidX(mainRect), CGRectGetMidY(mainRect));
    

    【讨论】:

      【解决方案2】:

      UIView 的center 是一个属性,而不是一个方法。

      你需要计算你想要放置它的实际位置。你可以通过设置视图的框架或设置它的中心来做到这一点,这在你的情况下更简单。

      你不说你是什么视图然后去把imageView 变成一个子视图。如果你把它放在一个叫做superview的东西里,你可以这样做:

      CGPoint superCenter = CGPointMake(CGRectGetMidX([superview bounds]), CGRectGetMidY([superview bounds]));
      [imageView setCenter:superCenter];
      

      【讨论】:

        【解决方案3】:

        根据parentView的rect的大小和原点定位imageView在parentView中的位置。

        给定一个名为 parentView 的父视图:

        float parentRect = parentView.frame;
        float imageRect = imageView.frame;
        
        imageRect.origin.x = (int)(parentView.origin.x + (parentRect.size.width - imageRect.size.width) / 2);
        imageRect.origin.y = (int)(parentView.origin.y + (parentRect.size.height- imageRect.size.height) / 2);
        imageView.frame = imageRect;
        

        将原点转换为 int 可确保您的居中图像不模糊(尽管它可能偏离中心一个子像素量)。

        【讨论】:

        • 建议使用 floor(parentView.origin.x + ...) 而不是 (int)(parentView.origin.x + ...),因为 origin.x 是 CGFloat。如果你转换为 int,那么它将再次转换为 float。
        【解决方案4】:
        CGRect r = thingToCenter.frame;
        r.origin = parentView.bounds.origin;
        r.origin.x = parentView.bounds.size.width / 2  - r.size.width / 2;
        r.origin.y = parentView.bounds.size.height / 2  - r.size.height / 2 + 12;
        thingToCenter.frame = r;
        

        【讨论】:

          【解决方案5】:
          CGRect CGRectIntegralCenteredInRect(CGRect innerRect, CGRect outerRect) {
              CGFloat originX = outerRect.origin.x + ((outerRect.size.width - innerRect.size.width) * 0.5f);
              CGFloat originY = outerRect.origin.y + ((outerRect.size.height - innerRect.size.height) * 0.5f);
              return CGRectIntegral(CGRectMake(originX, originY, innerRect.size.width, innerRect.size.height));
          }
          

          【讨论】:

          • 你应该使用CGRectIntegral()而不是自己做floorf()
          【解决方案6】:

          对于 Swift 4:

          CGPoint center = CGPoint(x: buttonRect.midX, y: buttonRect.midY)
          

          【讨论】:

            【解决方案7】:

            如果函数被频繁调用,为了简单起见,您还可以使用此处所示的宏。

            #define Center(x) CGPointMake(CGRectGetMidX(x), CGRectGetMidY(x));
            

            然后像这样使用它

            CGPoint myPoint = Center(myRect);
            

            【讨论】:

              【解决方案8】:

              斯威夫特 4

              let center = CGPoint(x: bounds.midX, y: bounds.midY)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-05-29
                • 1970-01-01
                • 2020-11-24
                • 1970-01-01
                • 1970-01-01
                • 2018-04-04
                相关资源
                最近更新 更多