标签: autolayout

UITableViewCell与AutoLayout的性能不佳

我有点困惑于这个......任何帮助都非常感激.我已经花了很多时间调试这个.

我有UITableView数据源提供NSFetchedResultsController.在单独的视图控制器中,我使用新的记录向CoreData插入[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:],保存托管对象上下文并关闭该控制器.很标准的东西.

然后通过NSFetchedResultsController以下方式接收托管对象上下文中的更改:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
        [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
        [self.tableView endUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
    switch (type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];

            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

            break;

        case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

            break;

        case NSFetchedResultsChangeMove:
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
            [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];

            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是出现问题的地方 - 这需要太长时间(在iPhone 4上大约3-4秒).似乎花费时间计算细胞的布局.

我从单元格中删除了所有内容(包括自定义子类)并将其保留UILabel,但没有任何改变.然后我将单元格的样式更改为Basic(或除Custom之外的任何内容)并且问题消失了 - 即时添加新单元格.

我加倍检查,NSFetchedResultsControllerDelegate回调只被调用一次.如果我忽略它们并做 …

iphone performance uitableview ios autolayout

19
推荐指数
2
解决办法
8905
查看次数

ios auto-layout:以编程方式设置宽度约束

我正在开发一个ios应用程序.我以编程方式将自动布局添加到2个标签.

我需要添加一个约束来使它们的宽度相等.

我知道如何通过使用以下方法来修复标签的宽度:

constraint = [NSLayoutConstraint
    constraintWithItem:myLabel
             attribute:NSLayoutAttributeWidth
            relatedBy:NSLayoutRelationEqual
              toItem: nil
           attribute:NSLayoutAttributeNotAnAttribute
          multiplier:1.0f
            constant:200.0f];
Run Code Online (Sandbox Code Playgroud)

这会将标签大小固定为常数.但我有2个标签,我希望它们具有相同的大小而不必设置常量.

iphone constraints ios autolayout

19
推荐指数
1
解决办法
2万
查看次数

如何在故事板上的Xcode 5中抑制约束和布局警告?

是否有任何标志可以抑制Xcode 5中故事板的不明确布局或错位视图.

我在代码中添加约束,我只是使用Interfacebuilder中的视图作为傻瓜.

我不想应用Xcode Resolve自动布局问题,因为我很高兴看到Interfacebuilder中的视图如何显示?

xcode cocoa ios autolayout

19
推荐指数
1
解决办法
5550
查看次数

iOS 8上的自动布局问题(代码在iOS 7上完美运行)

我有一个使用的应用程序,auto-layout当我在iOS 7设备上运行它时,一切仍然按预期工作,但是当我在iOS 8设备上运行时,我的一些约束有点古怪.

我实际上在另一个应用程序中遇到了类似的问题,但这不是一个大问题.现在,我开始怀疑它是否是iOS 8 SDK中的一个错误,或者是否有一种新的方法来处理iOS8中我不知道的自动布局.

这是我的设置:我有UIView一个UIImageView嵌入其中.视图和图像视图都有约束将其底部,前导和后沿固定到其超级视图,常量= 0.

UIView也有其固定到它的父顶部边缘,我必须以编程方式调整它连接到约束一个IBOutlet.它UIImageView具有第四个约束,将其高度固定到设备的高度(在我的情况下为568).

以下是我在iOS 7中期望/实现的行为:我正在尝试缩小容器视图的高度,并导致图像视图的顶部在没有宽高比变化的情况下被切断(看起来像你裁剪的那种图像的顶部关闭)...这就是我固定图像视图和底部边缘的高度的原因.

在iOS8中实际发生的事情:容器视图按预期收缩(它保持固定在侧面和底部,高度收缩).该UIImageView行为就好像它曾与cosntant == 0,而不是切断图像的顶部的顶部空间限制,整个图像逐渐缩小.由于我在AspectFit模式下有图像,因此侧面也会捏合以保持纵横比相同(但是imageView本身仍保持固定在前导,后沿和下边缘).

我该怎么做:我有一个通知,从我的代码的另一部分触发,以调整连接到IBOutlet的顶部空间约束.它调用的方法非常简单:

- (void) setTopSpaceForContainerView:(NSNotification*) notif{
    containerView_TopSpace.constant = [[notif.userInfo objectForKey:kTopSpace] intValue];
    [self.view setNeedsUpdateConstraints];
    [self.view setNeedsLayout];
}
Run Code Online (Sandbox Code Playgroud)

其他人有类似的经历吗?我正在尝试找到一种解决方法,但iOS 8似乎决心缩小我的图像.

万分感谢!

objective-c ios autolayout ios8

19
推荐指数
1
解决办法
9639
查看次数

UITableViewCell awakeFromNib框架大小错误

我有一个带约束的UITableViewCell,以便在iPhone 6和iPhone 6+上正确布局单元格.

单元格内容正确地正确调整大小.但是,我需要在其中一个视图上绘制一个子图层渐变.为了做到这一点,我正在使用awakeFromNib来绘制子层.

AwakeFromNib在自动调整之前给出了帧的大小,因此渐变子视图的大小不正确.

如果我使用layoutSubviews,第一次调用时,大小也是错误的,并且单元格需要在其大小合适之前滚动; 所以这个方法也行不通

我应该使用什么方法来获得正确的帧尺寸才能正确绘制?

iphone resize objective-c uitableview autolayout

19
推荐指数
3
解决办法
9415
查看次数

在键入时调整包含UITextView的UITableViewCell

我有一个包含自定义单元格的UITableViewController.每个单元格都是使用nib创建的,并包含一个不可滚动的UITextView.我在每个单元格中添加了约束,以便单元格将其高度调整为UITextView的内容.所以最初我的控制器看起来像这样:

初始状态

现在我希望当用户在单元格中键入内容时,其内容会自动适应.这个问题已被多次询问,特别是这里第二个答案.因此,我在代码中编写了以下代理:

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

然而,它会导致以下奇怪的行为:忽略所有约束,并且所有单元格高度都会崩溃到最小值.见下图:

错误的行为

如果我向下滚动tableView以强制进行新的cellForRowAtIndexPath调用,我将恢复单元格的正确高度:

正确的行为

请注意,我并没有如我所料的autoLayout来照顾这实现heightForRowAtIndexPath.

有人能告诉我我做错了什么或帮助我吗?非常感谢你 !

cocoa-touch uitableview uitextview ios autolayout

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

为什么 SwiftUI UIHostingController 有额外的间距?

我正在尝试使用 UIHostingController 将 SwiftUI 视图添加到 UIKit 视图,并且它显示额外的间距(此示例是为了模拟生产应用程序上的问题而制作的)。这是屏幕截图。

在此输入图像描述

布局概览:

View
  UIStackView
    UIImageView
    UIView(red)
    UIHostingController
    UIView(blue)
Run Code Online (Sandbox Code Playgroud)

问题: 快速 UI 视图 (UIHostingController) 显示在红色和蓝色视图之间,它在分隔线之后显示额外的间距。间距根据 SwiftUI 视图的大小而变化。

如果我减少行数(Hello World 文本)或减少间距,它似乎工作正常。

这是完整的源代码(https://www.sendspace.com/file/ux0xt7):

ViewController.swift(主视图)

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var mainStackView: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        addView()
    }


    private func addView() {
        mainStackView.spacing = 0
        mainStackView.alignment = .fill
        
        let imageView = UIImageView()
        imageView.image = UIImage(named: "mountain")
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true …
Run Code Online (Sandbox Code Playgroud)

autolayout swift swiftui uihostingcontroller ios15

19
推荐指数
3
解决办法
6566
查看次数

AutoLayout:在可以调整大小的超级视图中垂直居中两个UIView

我有一个UIButtons,一个在另一个的顶部,在superview中,其高度可以调整大小.两个按钮之间应有一个恒定的垂直间距,但顶部和底部间距应调整大小,以便在调整大小时两个按钮在superview中保持居中.

我尝试在每个按钮的superview的间距上创建两个小于或等于的约束(具有相同的优先级),以及按钮之间的恒定垂直间距,如下所示: 在此输入图像描述

(之所以它在这里小于或等于是因为这个视图是在IB的4英寸屏幕的给定高度定义的,但是可以缩小为3.5英寸的屏幕.)但是,这不起作用,正如您在应用程序运行时从屏幕截图中看到的那样: 在此输入图像描述

这几乎就像你想告诉AutoLayout这两个约束本身应该具有相等的值,即使它们都被设置为"小于或等于".有什么方法可以做我想做的事情,或者更好的方式?

iphone ios autolayout

18
推荐指数
2
解决办法
1万
查看次数

UILabel + AutoLayout =基线对齐错误

对齐两个标签时遇到问题.两个例子来说明问题

示例1(确定)

[leftLabel setText:@"03"];
[rightLabel setText:@"Description3"];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

例2(NOK)

[leftLabel setText:@"03"];
[rightLabel setAttributedText:[[NSAttributedString alloc] initWithString:@"Description3"]];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这两个示例中,布局约束都是这样

[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bigMargin-[leftLabel]-bigMargin-[rightLabel]-bigMargin-|"
                                        options:NSLayoutFormatAlignAllBaseline
                                        metrics:metrics
                                          views:views];
Run Code Online (Sandbox Code Playgroud)

问题是正确的标签,当文本是属性标签时,它被绘制在下面一点,如图中所示,并且对齐结果错误.

为什么?我能用这UIlabel两种方法解决这个问题吗?

编辑:

在GitHub上创建了一个项目,并对此进行了测试.这里的问题是即使没有NSAttributdString我也有问题!查看带有数字的标签,与说明和金额没有正确对齐.

在此输入图像描述

我在这里粘贴单元格的代码,但必须在项目中看到整个场景.

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

        UIView *contentView = [self contentView];

        [contentView setBackgroundColor:[UIColor clearColor]];

        dayLabel_ = [[UILabel alloc] initWithFrame:CGRectZero];
        [dayLabel_ setTranslatesAutoresizingMaskIntoConstraints:NO];
        [contentView addSubview:dayLabel_];

        monthLabel_ = [[UILabel alloc] initWithFrame:CGRectZero];
        [monthLabel_ setTranslatesAutoresizingMaskIntoConstraints:NO];
        [monthLabel_ setFont:[UIFont boldSystemFontOfSize:13.0f]];
        [contentView addSubview:monthLabel_];

        descriptionLabel_ = [[UILabel alloc] initWithFrame:CGRectZero];
        [descriptionLabel_ setTranslatesAutoresizingMaskIntoConstraints:NO];
        [descriptionLabel_ setFont:[UIFont …
Run Code Online (Sandbox Code Playgroud)

nsattributedstring ios autolayout

18
推荐指数
1
解决办法
8567
查看次数

UIStackView也可以在UITableViewCell中使用吗?

UIStackView用于调整视图大小,重新定位或折叠视图UITableViewCell吗?

uitableview ios autolayout ios9 uistackview

18
推荐指数
1
解决办法
2万
查看次数