标签: layoutsubviews

layoutSubviews在旋转时调用两次

当我的主视图旋转时,我想重新排列子视图,所以在我的ViewController中,我重写

willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
Run Code Online (Sandbox Code Playgroud)

并在那里设置子视图的帧.这一切都很好,但在子视图中我也被覆盖了

 layoutSubviews
Run Code Online (Sandbox Code Playgroud)

所以他们正确地布置自己.但问题是这个现在被调用两次 - 大概一次我在willAnimateRotationToInterfaceOrientation中设置Frame而一次因为旋转而设置.(如果我没有设置Frame,它会被调用一次.)

当然,ViewController负责布局框架,这看起来像是一个设计缺陷 - 什么是解决方案,所以layoutSubviews只调用一次?

rotation viewcontroller ios layoutsubviews

6
推荐指数
1
解决办法
4587
查看次数

有没有办法可以操作父视图控制器,以便子视图位于UIPageControl下面?

我通过使用UIPageViewController在应用程序中实现水平滚动,我将导航属性设置为"Horizo​​ntal",将Transistion Style设置为"scroll".一切正常,我可以添加一些正确呈现的子视图.我还想通过使用这两种方法来利用UIPageViewController所具有的内置UIPageControl:

-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
Run Code Online (Sandbox Code Playgroud)

这实际上显示了我正在寻找的东西:指示显示哪个子视图的点.但是,正如您在图像中看到的那样,UIPageControl设置在父视图控制器(UIPageViewController)的底部.您可以想象这不是我想要呈现我的UIPageControl的方式.有没有办法可以操作父视图控制器,以便子视图位于UIPageControl下面?还是有其他好的做法来实现这一目标吗?我知道我可以通过使用scrollView而不是UIPageViewController来实现水平滚动,但这似乎对我来说效率更高.

http://i48.tinypic.com/2hd03ev.png

为清晰起见:灰色部分是我的子视图,红色部分是我正在使用的底层UIPageViewController.

提前感谢您的回答!

objective-c uipagecontrol layoutsubviews uipageviewcontroller

6
推荐指数
1
解决办法
1385
查看次数

为什么layoutIfNeeded()允许在更新约束时执行动画?

我有两种状态UIView

在此输入图像描述 在此输入图像描述

@IBaction我在它们之间使用for进行动画button

@IBAction func tapped(sender: UIButton) {
    flag = !flag
    UIView.animateWithDuration(1.0) {
        if self.flag {
            NSLayoutConstraint.activateConstraints([self.myConstraint])
        } else {
            NSLayoutConstraint.deactivateConstraints([self.myConstraint])
        }
        self.view.layoutIfNeeded() //additional line
    }
}
Run Code Online (Sandbox Code Playgroud)

仅当我添加附加行时动画才起作用:

但是当我删除该行时,我的UIView就会更新但没有任何动画,它会立即发生。

为什么这条线会产生如此大的差异?运作如何?

layoutsubviews animatewithduration swift

5
推荐指数
1
解决办法
1485
查看次数

ios UITableViewCell以编程方式在drawRect vs layoutSubviews中创建

我一直试图UITableViewCell通过Autolayout 创建复杂但是它在滚动时给出了巨大的性能滞后,所以我决定采用基于帧的方式,即以编程方式.

单元格布局的复杂性就像Facebook卡片,其中每个单元格与动态文本和图像不同.

我试图渲染单元格,layoutSubviews但滚动仍然很差,但比Autolayout更好.

我也尝试渲染单元格drawRect,这提供了最佳性能但滚动时我无法更新帧,因为它只被调用一次.

有人可以指导我最好的情况,我可以用最好的滚动性能.我被卡住了.

uitableview drawrect ios layoutsubviews swift

5
推荐指数
1
解决办法
304
查看次数

在layoutSubviews中调用setNeedsDisplay?

考虑一个带有自定义背景的视图drawRect:.如果视图更改大小,则需要重新绘制背景.

这是一个坏主意吗?

- (void) layoutSubviews
{
    [super layoutSubviews];
    [self setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)

如果是,考虑到我无法控制谁更改视图的大小,那么什么是更好的选择呢?

iphone uiview drawrect ios layoutsubviews

4
推荐指数
1
解决办法
1886
查看次数

为什么不调用-layoutSubviews?

我正在尝试为某些子视图创建自定义布局.我的文件是a ViewController,所以我必须将其视图称为self.view.子视图是子视图self.view.

当我[self layoutSubviews];明确调用时viewDidLoad,它会-layoutSubviews毫无问题地执行代码.

但是,我已经读过,我不应该-layoutSubviews明确地打电话,或者打电话给它,self因为那是一个UIViewController.我尝试-setNeedsLayout通过这样调用它来实现:[self.view setNeedsLayout]in viewDidLoad,并取出显式调用-layoutSubviews但保留其声明.但这似乎不起作用.

我被链接到一篇关于何时调用layoutSubviews的文章,似乎应该在我添加子视图时调用它,但这似乎不会发生在这里.

如果我想要安全,并按照它在类引用UIView及其方法中的建议做事,那么我应该如何使用这两种方法呢?

cocoa-touch objective-c ios layoutsubviews

3
推荐指数
1
解决办法
7922
查看次数

自动布局会导致无限的layoutSubviews循环

我真的很困惑,当我在子视图上使用自动布局时,layoutSubview方法无限循环.

我所做的只是:

- (id)init
{
    self = [super init];
    if(self)
    {
        self.backgroundColor = [UIColor grayColor];
        _imageView = [[UIImageView alloc] init];
        _imageView.translatesAutoresizingMaskIntoConstraints = NO;
        [self addSubview:_imageView];

        [self applyConstraints];

    }
    return self;
}

-(void)applyConstraints
{
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_imageView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_imageView)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_imageView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_imageView)]];
}
Run Code Online (Sandbox Code Playgroud)

这会在layoutSubviews中导致无限循环.实际上,即使没有调用applyConstraints,也会发生循环,阻止它发生的唯一方法是将'translatesAutoresizingMaskIntoConstraints'设置为YES.

有没有人遇到/解决过这个问题?

更新 只是为了澄清,这是一个UIView子类,在视图控制器中使用.视图本身不使用自动布局,而是在初始化后将帧设置为旧式.

objective-c infinite-loop ios layoutsubviews autolayout

3
推荐指数
2
解决办法
6039
查看次数

约束和自动布局后面的IOS算法

我正在尝试对IOS中的layoutSubviews函数进行逆向工程,它会计算自动调整大小和约束.通常,如果我们在订单中创建约束:A取决于(约束)B,B取决于C,并且C使用固定框架,系统应该足够智能以按顺序实现计算:C - > B - > A以避免不必要的循环.

我的问题是:IOS(或算法是什么)如何遍历NSLayoutContraint列表并按此顺序计算帧?

algorithm constraints ios layoutsubviews autolayout

3
推荐指数
1
解决办法
1160
查看次数

Swift - UIBezierPath调用中的额外参数'radius'

我正在调整Objective-C库(STKSpinnerView)到Swift,我无法解决这个错误:

func getRadius() -> CGFloat {
    var r : CGRect = CGRectInset(self.bounds, self.wellThickness/2.0, self.wellThickness/2.0)
    var w : CGFloat = r.size.width
    var h : CGFloat = r.size.height

    if w > h {
        return h/2.0
    }else{
        return w/2.0
    }
}

override func layoutSubviews()  {
    super.layoutSubviews()

    var bounds : CGRect = self.bounds
    var wt : CGFloat = self.wellThickness
    var outer : CGRect = CGRectInset(self.bounds, wt/2.0, wt/2.0)
    var inner : CGRect = CGRectInset(self.bounds, wt, wt)

    var innerPath : UIBezierPath = UIBezierPath(ovalInRect: inner) …
Run Code Online (Sandbox Code Playgroud)

layoutsubviews uibezierpath swift

3
推荐指数
1
解决办法
3000
查看次数

我如何在UICollectionViewCell中绕过UIImageView?

在我的UICollectionViewCell类中,我写了这个:

- (void)layoutSubviews {
    [super layoutSubviews];
    self.myImageView.layer.cornerRadius  = CGRectGetHeight(self.myImageView.frame) / 2;
    self.myImageView.layer.masksToBounds = YES;
}
Run Code Online (Sandbox Code Playgroud)

但这在所有情况下都无法正常工作,它看起来像这样:

在此输入图像描述

calayer uiimageview ios layoutsubviews

3
推荐指数
1
解决办法
748
查看次数