设置UIView的位置和大小

时间:2014-06-08 19:17:24

标签: ios cocoa-touch

创建新的UIView或平移/滑动视图到新位置时,设置新位置和大小的正确方法是什么。目前,要移动平移/滑动操作产生的视图,我使用的比率基于我正在移动的视图的原始位置及其与其他视图和项目(导航栏)的关系。

由于滑动而移动视图时,我执行以下操作:

CGFloat swipeUpDelta = -1 *(self.view.bounds.size.height - (self.view.bounds.size.height - recordView.frame.origin.y) - (self.navigationController.navigationBar.bounds.size.height + ([UIApplication sharedApplication].statusBarFrame.size.height)));

[UIView animateWithDuration:.1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
    recordView.frame = CGRectOffset(recordView.frame, 0, swipeUpDelta);
} completion:nil];

或创建一个在我的viewcontroller中呈现sineWave的视图:

self.sineWave = [[OSDrawWave alloc] initWithFrame:CGRectMake(-1*self.view.bounds.size.width, (.75*self.view.bounds.size.height), 2*self.view.bounds.size.width, .3125*(2*self.view.bounds.size.width))];

一切正常,但我想知道是否有更好的方法来做这些事情。

2 个答案:

答案 0 :(得分:0)

我不确定我理解这个问题。 initWithFrame:myView.frame被认为是定位UIView的正确方法。使用具有新帧大小的animateWithDuration:也是非常标准的。

答案 1 :(得分:0)

我不确定你的意思。移动UIView时,您可以通过多种方式移动视图,这取决于您的代码以及您想要的内容。下面是一个有效的代码示例,用于在UIView中移动CALayer以跟随触摸位置。您可以使用此功能,您可以为视图设置动画,在更改图层的位置或视图中心时可以使用显式动画(默认情况下,iOS会为CALayer的任何更改的属性值设置动画...您可以使用此设置如果你愿意,可以为UIViews启用此功能)。如果您正在移动UIView,最好根据center属性移动视图。这几乎是SpriteKit的工作原理和任何高功能的动画引擎(避免总是重置帧...特别是如果你不需要)。

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *t = [touches anyObject];
    CGPoint p = [t locationInView:self];
    boxLayer.position = p;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *t = [touches anyObject];
    CGPoint p = [t locationInView:self];
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    boxLayer.position = p;
    [CATransaction commit];
}

请注意,请注意以下代码行中的注释

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
/*UITouch *t = [touches anyObject];
CGPoint p = [t locationInView:self]; // this causes the animations to appear sluggish as there is a consistant change in destination location. The above code corrects this. 
[boxLayer setPosition:p];*/

这是有效的,可能会提供您想要的结果......这一切都取决于您想要的结果。