小编xxt*_*axx的帖子

UICollectionViewFlowLayout在方向更改时不会失效

我有一个带有UICollectionViewFlowLayout的UICollectionView.我还实现了UICollectionViewDelegateFlowLayout协议.

在我的数据源中,我有一堆UIViewControllers响应自定义协议,所以我可以询问它们的大小和其他一些东西.

在FlowLayout委托中,当它要求sizeForItemAtIndexPath:时,我返回从我的协议获得的项目大小.实现我的协议的ViewControllers根据方向返回不同的项目大小.

现在,如果我将设备方向从纵向更改为横向,则没有问题(项目在横向上更大)但如果我将其更改回来,我会收到此警告:

    the item width must be less that the width of the UICollectionView minus the section insets left and right values.
    Please check the values return by the delegate.
Run Code Online (Sandbox Code Playgroud)

它仍然有效,但我不喜欢它得到警告所以也许你可以告诉我我做错了什么.还有另一个问题.如果我没有告诉我的collectionViews collectionViewLayout在willAnimateRotationToInterfaceOrientation中失效:从不调用sizeForItemAtIndexPath :.

希望你明白我的意思.如果您需要其他信息,请告诉我:)

ios uicollectionview uicollectionviewlayout

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

在RecyclerView中创建最后一个项目/ ViewHolder,填充屏幕的其余部分或具有最小高度

我正在使用RecyclerView.我使用循环器视图来显示模型类的详细信息.

//My model class
MyModel {
    String name;
    Double latitude;
    Double longitude;
    Boolean isOnline;
    ...
}
Run Code Online (Sandbox Code Playgroud)

由于某些值可能不存在,我使用RecyclerView和自定义视图类型(一个代表我的模型的每个值).

//Inside my custom adapter
public void setModel(T model) {
    //Reset values
    itemCount = 0;
    deviceOfflineViewPosition = -1;
    mapViewPosition = -1;

    //If device is offline, add device offline item
    if (device.isOnline() == null || !device.isOnline()) {
        deviceOfflineViewPosition = itemCount;
        itemCount++;
    }

    //Add additional items if necessary
    ...

    //Always add the map as the last item
    mapViewPosition = itemCount;
    itemCount++;

    notifyDataSetChanged();
}

@Override
public int …
Run Code Online (Sandbox Code Playgroud)

android google-maps adapter android-adapter android-recyclerview

14
推荐指数
1
解决办法
2158
查看次数

MKMapView忽略了iOS 11和iPhone X上的安全区域

我正在尝试将应用程序迁移到iOS 11,而且几天后我又遇到了一个丑陋的UI错误.这次:MKMapView.我有一堆按钮,我固定到安全区布局指南,一切正常 - 除了MKMapView.

它完全忽略了安全区域,因此指南针和法律按钮隐藏在条形图或我自己的UI元素下.为了验证,我创建了一个只有一个普通UIViewController的新项目.然后我添加了一个MKMapView并配置了自定义的"additionalSafeAreaInsets",它们确实被完全忽略了.

更糟糕的是,即使只使用MKMapView,合法标签在iPhone X上也显得非常错误.

问题:有没有什么方法可以插入法律标签和指南针,以免被自定义视图隐藏?

在此输入图像描述

iphone mapkit mkmapview ios safearealayoutguide

8
推荐指数
1
解决办法
1060
查看次数

带有3个标签的iOS水平UIStackView - 第一个标签将其他标签推到视线之外

我不确定我UIStackView是否理解正确.我有UIStackView一个UITableViewCell.它包含3 UILabel并设置为对齐和分配填充.

当我的第一个标签文字不长时,它看起来都很好.第二个和第三个标签占用了他们需要的空间,并且它们与右侧对齐.第一个标签占据了剩下的空间.

但是,当第一个标签包含大量文本时,它会将其他两个标签推出可见区域.我该怎么做才能确保第二个和第三个标签始终可见,并占用显示其内容所需的空间.第一个标签应始终占用剩余的可用空间,然后用"..."截断其文本

这是我在Storyboard中的配置:

UIStackView配置

这就是TableView中的结果:

UIStackView结果在UITableView中

uilabel ios autolayout swift uistackview

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

将未知的 Encodable 枚举值解码为默认值

我必须像这样反序列化一个 JSON 字符串:

{ "name" : "John Smith", "value" : "someValue" }
Run Code Online (Sandbox Code Playgroud)

在 Swift 4 中,“value”应该是一个枚举,整个对象是一个结构体,如下所示:

struct MyType {
    name: String?
    value: Value?
}
Run Code Online (Sandbox Code Playgroud)

在未来的某个时候,后端可能会添加新的枚举值,所以我认为进行一些回退是明智的。

我以为我可以创建一个枚举

enum Value {
    case someValue
    case someOtherValue
    case unknown(value: String)
}
Run Code Online (Sandbox Code Playgroud)

但我无法解决如何反序列化该枚举并使其工作。以前我只是使用String枚举,但反序列化未知值会引发错误。

是否有一种简单的方法可以使其工作,或者我应该将值反序列化为 aString并在结构中创建一个自定义 getter 并使用 switch 语句返回其中一种情况(甚至可能不是在结构本身中,而是在我的视图模型中)?

enums json deserialization swift codable

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

相当于 Android 的 DiffUtil for Swift / iOS 或其他有效的实现

在我的应用程序中,我必须从网络服务加载一些数据。然后,我必须按模型集合属性的模型属性对数据进行排序,然后使用新数据更新我的集合视图。

不幸的是,我不知道如何知道哪个单元格移动到了哪个新位置。在 Android 上,我过去使用过 DiffUtil,但我不知道 Swift 是否相当于在我的集合视图中对更改进行动画处理。

这是我使用的数据模型。对于这个例子,我省略了所有其他字段并使用协议使其更清晰(至少我希望这使其更清晰):

protocol Alert {
  var date: Date
  var statusType: StatusType
}

protocol Status {
  var statusType: StatusType
  var level: Level
}

protocol Device {
  var states: [Status] //Contains never more than 1 Status of each StatusType so its basically a set
  var alertsByStatusType: [StatusType: [Alert]]
}

enum StatusType {
  case someStatus, someOtherStatus
}

enum Level {
  case low, medium, high
}
Run Code Online (Sandbox Code Playgroud)

Web 服务返回给我一个设备,其中包含状态集合和警报集合。

//Web service model kind of sucks
protocl WebServiceDevice {
  var …
Run Code Online (Sandbox Code Playgroud)

diff tableview ios swift

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

iOS Swift:如何重新创建照片应用程序UICollectionView布局

我想知道如何安静一段时间如何创建iOS照片应用程序布局.我怎样才能使它看起来像放大到一个集合,同时导航栏显示一个后退按钮?

它是一个新的视图控制器,它被推送到UINavigationController?如果是这样,他们在扩展时如何设法匹配瓷砖.

甚至可能有第三方库让我轻松地重新创建这样的布局?

希望你能帮助我理解这是如何工作的概念.

transitions uinavigationcontroller ios uicollectionview swift

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

什么是Swift通过Enum重用UIAlertController配置的最佳实践

我正在努力让我的生活更轻松,我的应用程序更易于维护,同时减少重复代码的数量.所以我认为把一些代码显示到它自己的类中的某种类型的UIAlertController会很好.

问题是,我有基本相同的警报,根据我在我的应用程序中显示它的位置,它只是略有不同.所以我想:为什么不使用枚举,每次我想显示那种警报时,只需给它枚举值即可.在我的代码中到处删除所有重复的字符串.

我喜欢斯威夫特的精灵.他们只是如此狡猾 - 呃我的意思是很开心.所以我想出了这个例子枚举:

enum MyAlertType {
    case a
    case b
}
Run Code Online (Sandbox Code Playgroud)

接下来,我创建了一个简单的类来处理显示:

class MyAlert {
    static func showAlert(ofType type: MyAlertType, inViewController viewController: UIViewController, handler: ((UIAlertAction) -> ())? = nil, completion: (() -> ())? = nil) {

        var message: String
        switch type {
        case .a:
            message = "A is a nice letter!"
        case .b:
            message = "B is a nice letter!"
        }

        let alert = UIAlertController(title: "Do you know which letter is nice?", message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Ok", …
Run Code Online (Sandbox Code Playgroud)

enums protocols uiviewcontroller ios swift

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