小编msm*_*lko的帖子

Casting Class类型

我知道可以定义响应给定协议的Class属性,例如:

Class <MyProtocol> class = [object class];
Run Code Online (Sandbox Code Playgroud)

但是在Objective-C中是否有任何方法可以将Class类型转换为我的类?

Class unknownClass = [object class];
[((MyClass)unknownClass) myMethod]; // How can I cast Class to MyClass?
Run Code Online (Sandbox Code Playgroud)

casting class objective-c

17
推荐指数
2
解决办法
5119
查看次数

为什么[UIColor whiteColor]和blackColor的亮度相等

让我向您展示一些获得三个UIColors的色调,饱和度和亮度的结果.

[[UIColor redColor] getHue:&hue
                saturation:&saturation
                 brightness:&brightness
                 alpha:&alpha];

hue = 1.0 saturatino = 1.0 brightness = 1.0 alpha = 0.0
Run Code Online (Sandbox Code Playgroud)

[[UIColor whiteColor] getHue:&hue
                  saturation:&saturation
                  brightness:&brightness
                       alpha:&alpha];

hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0
Run Code Online (Sandbox Code Playgroud)

[[UIColor blackColor] getHue:&hue
                  saturation:&saturation
                  brightness:&brightness
                       alpha:&alpha];

hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么色调,饱和度,白色和黑色的亮度相等?为什么alpha等于零?

我想在我的项目中做的是通过改变它的亮度从给定的颜色生成"更暗"的颜色:

亮度=亮度*0.8;

它适用于任何颜色,但它从白色产生黑色.(虽然我希望有一种灰色).

iphone cocoa cocoa-touch uikit ios5

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

AVAudioSession - 如何在扬声器和耳机输出之间切换

我试图在通话期间模仿电话应用程序中的行为。您可以轻松地在扬声器或耳机之间切换输出源。我知道我可以在通过调用连接耳机时强制扬声器作为输出:

try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)  
try! audioSession.overrideOutputAudioPort(.speaker)  
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我看不到任何方法来检测耳机是否仍连接到设备。

我最初认为outputDataSourcesAVAudioSession 会返回所有可能的输出,但它总是返回 nil。

有什么我想念的吗

avfoundation ios avaudiosession

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

NSFetchedResultsController 返回重复项(相同的 objectID 和引用)

我在使用 NSFetchedResultsController 时遇到了奇怪的行为。它是 iOS 10 中的新功能。直截了当:fetchedObjects包含重复的对象。

在我自己的标准中,这绝不是“重复”。它们实际上具有相同的 objectID 和相同的引用。

它是如何在我的应用程序中发生的:

  1. FRC 已设置并执行提取

  2. 获取 2 个对象(在本例中)

  3. 我的同步层发生了一些事情,更新了另一个对象(获取项目与之相关)

  4. FRC 调用delegate 表示内容确实发生了变化。fetchedObjects包含 4 个对象(2 个重复)

这是我在controllerDidChangeContent方法中调试的控制台输出。

po frc.fetchedObjects

    - 0 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... }

    - 1 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... }

    - 2 : <ListItem: 0x1704c49f0> (entity: ListItem; id: 0x170631680 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495446> ; data: { ... }

    - 3 : <ListItem: …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchedresultscontroller ios ios10

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

UIScrollView 和 targetContentOffset 无法正常工作

我希望 UIScrollView 始终滚动回特定点。我已经通过写作实现了它:

   - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{
    (*targetContentOffset).x = 0.0f;
}
Run Code Online (Sandbox Code Playgroud)

除了一个例外,它工作得很好。当我滚动足够远并到达视图的末尾(然后开始弹跳)并向上拉我的手指时,视图会平滑地滚动并减速一点,然后停止然后跳转(没有动画)我设置的位置。只要我不滚动到滚动视图的末尾,它就不会发生。

这是我如何初始化 UIScrollView

  scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 284, frame.size.height)];
  scrollView.backgroundColor = [UIColor clearColor];
  scrollView.delegate = self;

  [scrollView setContentSize:CGSizeMake(285,frame.size.height)];
  [self addSubview:scrollView];

  UIEdgeInsets inset = scrollView.contentInset;
  inset.left = 60;
  inset.right = 60;
  [scrollView setContentInset:inset];
Run Code Online (Sandbox Code Playgroud)

cocoa animation scroll uiscrollview ios

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

SwiftUI - ObservedObject 永远不会被释放

我的应用程序正在泄漏模型对象,因为对象正在保留保留视图本身的闭包。最好通过例子来说明。在下面的代码中,消失Model后并没有释放ContentView

//
// Content View is an owner of `Model`
// It passes it to `ViewB`
//
// When button is tapped, ContentView executes action
// assigned to Model by the ViewB
//
struct ContentView: View {
    
    @StateObject private var model = Model()
    
    var body: some View {
        VStack {
            Button(action: {
                model.action?()
            }) {
                Text("Tap")
            }
            ViewB(model: model)
        }
        .frame(width: 100, height: 100)
        .onDisappear {
            print("CONTENT DISAPPEAR")
        }
    }
}

struct ViewB: View {
    
    @ObservedObject …
Run Code Online (Sandbox Code Playgroud)

macos ios swiftui

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

Reactive Cocoa:仅订阅新值

我是Reactive Cocoa的新手.我想要实现的是每次财产价值变化时都会收到通知.但是,当属性设置为相同值时,我不希望收到通知.这是一些代码:

self.testProperty = 0;
[[RACObserve(self, self.testProperty) skip:1] subscribeNext:^(id x) {
    NSLog(@"Did Change: %@", x);
}];

self.testProperty = 1;
self.testProperty = 1;
self.testProperty = 1;
self.testProperty = 1;
self.testProperty = 1;
Run Code Online (Sandbox Code Playgroud)

这就是我在控制台输出上得到的结果

> Did Change: 1
> Did Change: 1
> Did Change: 1
> Did Change: 1
> Did Change: 1
Run Code Online (Sandbox Code Playgroud)

我预计"改变了"只打印一次,而不是五次.有没有办法只订阅新值?

cocoa ios reactive-cocoa

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

如何为视图插入/删除的过渡设置动画?插入动画不起作用

我无法在 SwiftUI 中进行插入转换。

我有一个Group有条件地显示两个视图之一的视图。当我尝试为过渡设置动画时,删除过渡有效,但插入无效- 视图立即出现,没有任何动画。

我将其粘贴在我的视图代码下面。我怎样才能做到这一点? (Xcode 11.3.1)

struct TestView: View {

    @State private var showView = false

    var body: some View {
        VStack {
            Button(action: {
                withAnimation {
                    self.showView.toggle()
                }

            }) {
                Text("Tap")
            }

            Group {
                if showView {
                    Color.red
                        .frame(width: 100, height: 100)
                } else {
                    Color.blue
                        .frame(width: 100, height: 100)
                        .cornerRadius(50)
                }
            }
            .transition(.asymmetric(insertion: .move(edge: .leading),
                                    removal: .move(edge: .trailing)))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

正如 @Asperi 在评论中指出的那样,代码是正确的,但是......它仅在真实设备上运行时才有效。Xcode 中的实时预览存在缺陷,并且显然不能很好地处理转换。

所以这个问题的答案很简单:在真机上测试!:)

animation transition swiftui

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

SwiftUI 视图首选项:在复杂容器上使用时,overlayPreferenceValue 返回 nil

我正在尝试anchorPreference在我的 VStack 中的某些视图上绘制覆盖图。然而,它只适用于最简单的情况。当我的 VStack 的内容变得稍微复杂一点时,就永远不会绘制覆盖层。

这是我的代码

struct debug_test: View {
@State private var someState = false

var body: some View {
    VStack {
        Text("Hello World !!!")
            .anchorPreference(
                key: BoundsPreferenceKey.self,
                value: .bounds
            ) { $0 }

        //////////////////////////////////////////////////////////
        // When I remove below lines - it works ok.
        // But when I put add some conditionally-visible view and one more view
        // it stops drawing an overlay.
        // Apparently, `preferences` is always nil in that case.
        if someState {
            Text("Pooop") …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

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

连接到已完成的发布者时接收器不接收值

我正在努力理解为什么sink底层代码中没有收到任何值。

func somePublisher() -> AnyPublisher<Bool, Never> {
   let subject = PassthroughSubject<Bool, Never>()
   subject.send(true)
   subject.send(completion: .finished)
   return subject.eraseToAnyPublisher()
}

somePublisher()
   .first()
   .sink { _ in
      print("Completed")
   } receiveValue: {
      print("Received \($0)")
   }
   .store(in: &sinks)
Run Code Online (Sandbox Code Playgroud)

输出:

完全的

如果在连接之前完成,下游的发布者似乎不会收到值。是对的吗?如果我的发布商可以同步完成,我该如何解决这个问题?

swift combine

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

使用Blend Filter时GPUImage崩溃('over release framebuffer')

由于我在尝试将混合滤镜应用于图像并显示它时遇到的崩溃,我感到头疼.我想要做的只是将叠加图像放到另一个图像上.

这是我的代码:

- (GPUImageOutput<GPUImageInput> *)myFilter
{
    GPUImageFilterGroup *filtersGroup = [GPUImageFilterGroup new];

    // Saturation
    GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new];
    saturationFilter.saturation = 0.0;
    [filtersGroup addFilter:saturationFilter];

    // Noise
    UIImage *noiseImage = [UIImage imageNamed:@"noise.png"];
    GPUImagePicture *noisePicture = [[GPUImagePicture alloc] initWithImage:noiseImage];
    GPUImageAddBlendFilter *blend = [GPUImageAddBlendFilter new];
    [blend useNextFrameForImageCapture];
    [filtersGroup addFilter:blend];
    [noisePicture addTarget:blend atTextureLocation:1];
    [noisePicture processImage];

    [saturationFilter addTarget:blend];

    filtersGroup.initialFilters = @[saturationFilter];
    filtersGroup.terminalFilter = blend;

    return filtersGroup;
}
Run Code Online (Sandbox Code Playgroud)

    // Applying filter
    GPUImageOutput <GPUImageInput> *effect = [self myFilter];
    self._photoHandle = [[GPUImagePicture alloc] initWithImage:staticImage];
    [self._photoHandle addTarget:effect];
    [effect addTarget:self.targetPreviewView];
    [self._photoHandle …
Run Code Online (Sandbox Code Playgroud)

ios gpuimage

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

Swift Combine - 组合发布者,无需等待所有发布者发出第一个元素

我正在合并两个出版商:

let timer = Timer.publish(every: 10, on: .current, in: .common).autoconnect()
let anotherPub: AnyPublisher<Int, Never> = ...

Publishers.CombineLatest(timer, anotherPub)
    .sink(receiveValue: (timer, val) in { 
      print("Hello!")
} )
Run Code Online (Sandbox Code Playgroud)

不幸的是,直到两个发布者都发出至少一个元素时才会调用 sink。

有没有办法让接收器在不等待所有发布者的情况下被调用?因此,如果任何发布者发出一个值,则会调用 sink 并将其他值设置为 nil。

ios swift combine

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