【问题标题】:Modifying UIView frame more easily?更容易修改 UIView 框架?
【发布时间】:2013-01-09 20:18:20
【问题描述】:

通常我只需将视图向下移动 5 个像素。 我的做法是这样的

view.frame = CGRectMake(view.frame.origin.x,
                        view.frame.origin.y + 5,
                        view.frame.size.width,
                        view.frame.size.height);

没有更简单的方法吗? :-/

【问题讨论】:

    标签: ios objective-c cocoa-touch uiview cgrectmake


    【解决方案1】:

    另一种解决方案

    view.frame = CGRectOffset( view.frame, 0, 5 );
    

    【讨论】:

      【解决方案2】:

      我在github 上有一个宏,可以让你这样做

      @morph(view.frame, _.origin.y += 5);
      

      或者如果你想改变y height

      @morph(view.frame, {
          _.origin.y += 5;
          _.size.height -= 5;
      });
      

      【讨论】:

        【解决方案3】:

        稍微好一点:

        view.center = CGPointMake(view.center.x, view.center.y+5);
        

        【讨论】:

        • 这是否保留了在设置框架时完成的那些内部重新计算?它们是只有框架作为一个整体是可变的而不是框架的属性的原因..
        • 试试看!改变中心会影响 frame.origin 但不会改变 frame.size。通常它更安全(如果对视图应用变换,框架原点会变得不可靠,建议您改用中心和边界)。
        • @Earl,你所说的“内部重新计算”是什么意思?
        • 你应该小心设置一个视图的中心基于另一个,因为它可能会导致结果帧不在像素边界上并导致一些毛茸茸的渲染
        • 任何时候应用转换都会遇到这个问题。
        【解决方案4】:

        我有这些宏:

        #define VIEW_INCREASE_Y(view, value) view.frame = CGRectMake(view.frame.origin.x,view.frame.origin.y+value,view.frame.size.width,view.frame.size.height)
        

        那么你可以这样做:

        VIEW_INCREASE_Y(customView, 25);
        

        【讨论】:

          【解决方案5】:

          也许我应该为 UIView 类写一堆类别。

          有点像

          -(void)changeFrameOriginHorizontally:(NSInteger)paramHorizontalChange
                                    vertically:(NSInteger)paramVerticalChange;
          
          -(void)changeFrameSizeHorizontally:(NSInteger)paramHorizontalChange
                                  vertically:(NSinteger)paramVerticalChange;
          

          我不喜欢我原来帖子中的解决方案的主要原因是它非常不友好且过于冗长。

          我会允许负值和正值,nil 表示没有变化。

          你们觉得呢?

          【讨论】:

          • 您的解决方案看起来将代码(非)意义交换为代码气味......您在隐藏您正在执行框架操作(如果这是您将放在这些类别后面的内容)。正如我已经评论过的,如果您的视图需要进行转换,Apple 不支持 frame.origin 计算。
          • 呵呵..我忘了传递对视图的引用 :)
          • UIView 上的类别不需要参考
          • 啊..真的..我会在视图本身上调用它。
          • 类别名称不是明确说明会发生什么吗?那是怎么藏起来的?
          【解决方案6】:

          如果你想走类别路线,你应该给它一个前缀以避免方法名称冲突。

          例如

          - (void)ps_addOffset:(CGPoint)offset;
          {
              self.frame = CGRectIntegral(CGRectOffset(self.frame, offset.x, offset.y));
          }
          

          【讨论】:

            【解决方案7】:

            我喜欢使用宏:

            #define width(a) a.frame.size.width
            #define height(a) a.frame.size.height
            #define top(a) a.frame.origin.y
            #define left(a) a.frame.origin.x
            #define bottom(a) top(a)+height(a)
            #define right(a) left(a)+width(a)
            
            #define FrameReposition(a,top,left) a.frame = CGRectMake(x, y, width(a), height(a))
            

            .....

            FrameReposition(myView,0,0);
            

            【讨论】:

              猜你喜欢
              • 2014-04-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-19
              • 2013-10-24
              • 1970-01-01
              相关资源
              最近更新 更多