gezinme çubuğu sağ çubuk öğesi resim düğmesi hatası iOS 11


101

Bu kod ios10'da sorunsuz çalışır. etiketimi ve kullanıcı fotoğraf profili olan bir resim düğmesini alıyorum, dairesel yuvarlak .. tamam. ancak xcode 9 ios11 simülatörünü çalıştırdığımda onu gerdiriyorum. sim'i kontrol ederken ve görünümü alırken ve çıktı aldığım görünümü 170x32 veya bunun gibi bir şey olarak tanımlamak için xcode söylerken düğme çerçevesi 32x32 olmalıdır.

benim kodum bu.

let labelbutton = UIButton( type: .system)
    labelbutton.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
    labelbutton.setTitleColor(UIColor.white, for: .normal)
    labelbutton.contentHorizontalAlignment = .right
    labelbutton.titleLabel?.font = UIFont.systemFont(ofSize: 18.00)



    let button = UIButton(type: .custom)
     button.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
     button.frame = CGRect(x: 0, y: 0, width: 32, height: 32)
     button.setTitleColor(UIColor.white, for: .normal)
     button.setTitleColor(UIColor.white, for: .highlighted)


    var buttomItem : UIBarButtonItem = UIBarButtonItem()
    buttomItem.customView = button
    buttomItem.target = self
    buttomItem.action = "ToLogin"

    var labelItem : UIBarButtonItem = UIBarButtonItem()
    labelItem.customView = labelbutton
    labelItem.target = self
    labelItem.action = "ToLogin"


    if let user = PFUser.current() {
        print("LOGIN : checkiando si existe usuario ")
            labelbutton.setTitle(USERNAME, for: UIControlState.normal)
            labelbutton.sizeToFit()

        if(user["profile_photo_url"] != nil) {
            print(" ENCONTRO PROFILE PHOTO URL NOT NIL Y ES \(user["profile_photo_url"])")
            let photoURL = user["profile_photo_url"] as! String
            let a = LoginService.sharedInstance
            a.downloadImage(url: photoURL, complete: { (complete) in

                if (complete) {

                    button.setImage(LoginService.sharedInstance.profile_photo! , for: UIControlState.normal)

                    button.layer.cornerRadius = 0.5 * button.bounds.size.width
                   // button.imageView!.contentMode = .scaleAspectFit
                   // button.imageView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
                    //button.imageView!.contentMode = .scaleAspectFit
                    //button.imageView!.clipsToBounds = true
                    //button.imageView!.layer.cornerRadius = 60
                    button.clipsToBounds = true
                    self.NavigationItem.rightBarButtonItems = [buttomItem,labelItem]
                }


            })
        } else {
                self.NavigationItem.rightBarButtonItem = labelItem

        }
            print(" EL FRAME DEL BUTTON ES \(button.frame)")

    } else {

        labelbutton.setTitle("Login", for: UIControlState.normal)
        labelbutton.sizeToFit()
        self.NavigationItem.rightBarButtonItem = labelItem

    }

görüntü açıklamasını buraya girin


Gezinme çubuğunda yığın görünümünü kullandınız mı?
Vlad Khambir

@ V.Khambir Nop ...: /
lorenzo gonzalez

bu hata raporu herhangi bir yerde mi?
Edu

iOS 11, gezinme öğelerini düzenlemek için Otomatik Yerleşimi kullanır. Eğer kaydırmaya gerek UIButtoniçeride UIBarButtonItem, kullanımıbutton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
onmyway133

Yanıtlar:


188

Nedeni

Sorun, ios 11'den UIBarButtonItemçerçevelerle uğraşmak yerine otomatik düzen kullanması nedeniyle ortaya çıkıyor .

Çözüm

Xcode 9 kullanıyorsanız, bu resim düğmesi için genişlik sınırlaması eklemelisiniz.

 button.widthAnchor.constraint(equalToConstant: 32.0).isActive = true
 button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true

PS

buttondeğil UIBarButtonItem, UIButtoniçeride UIBarButtonItem. Kısıtlama için değil UIBarButtonItem, içindeki öğeler için ayarlamalısınız .


3
@ V.Khambir şimdi bu sorunu alıyorum. Ancak xcode 9 ile aynı çözümle ve ios 1 cihazında çalıştırırsam sorun değil ... Ama eğer ios 10 sürüm cihazında çalıştırırsam ... çubuk düğmesi resimlerim hiç gösterilmiyor. Bunun için tüm sürümleri nasıl düzeltebilirim? Her iki ios 11, ios 10 cihazını kontrol ettim. Yalnızca ios 1 sürümünde iyi gösteriliyor. ios 10'da, görüntü hiç gösterilmiyor
david

@spikesa, her iki iOS sürümünde de çalışmalıdır, muhtemelen yanlış kısıtlamalar ayarlamışsınızdır.
Vlad Khambir

@ V.Khambir 'UIBarButtonItem' türünün değeri, Xcode 9'da bir #available (iOS 11.0, *) koşullu içinde 'widthAnchor' üyesine sahip değil mi?
Ryan Brodie

1
@jped bunun için bir çözüm buldunuz mu? Xcode 9 ile iOS 10'da benim için de çalışmıyor
swalkner

1
Harika. Bu kırılma değişikliklerini sevmelisin. Apple, bu tür değişikliklerin listesini bir sayfada veya bir yerde sürüm notlarında belgeledi mi?
GONeale

53

Katkıda bulunduğunuz için teşekkürler! haklısınız !. xcode9 ios11 için bir kısıtlama koymanız gerekir.

 let widthConstraint = button.widthAnchor.constraint(equalToConstant: 32)
 let heightConstraint = button.heightAnchor.constraint(equalToConstant: 32)
 heightConstraint.isActive = true
 widthConstraint.isActive = true

1
Bu benim için de işe yaradı, ancak daha önce hiç olmadığı halde iOS 11 için bunun neden gerekli olduğunu kimse açıklayabilir mi?
stonedauwg

9
UINavigationBar artık alt görünümlerini Otomatik Yerleşim kullanarak
düzenliyor

2
Yaptığım aynı hatayı yapmayın: translatesAutoresizingMaskIntoConstraints
Kapattım

2
Value of type 'UIBarButtonItem' has no member 'widthAnchor'Xcode 9'da bir if #available(iOS 11.0, *)koşul içinde mi?
Ryan Brodie

@ lorenzo-gonzalez Bunu nasıl başardınız? Ben buna takıldım.
Alessandro Lucarini

18

Hedef C kodu artık kullanılmıyor. Ancak, iOS 11'de Objective C projeleri oluşturması / sürdürmesi gereken kullanıcılar için Swift'den (Karoly Nyisztor cevabı) Objective C'ye aşağıdaki çeviriyi faydalı buluyor.

//  UIView+Navbar.h

#import <UIKit/UIKit.h>

@interface UIView (Navbar)

- (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height;

@end

//----------

//  UIView+Navbar.m

#import "UIView+Navbar.h"

@implementation UIView (Navbar)

- (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height
{
    if (width == 0 || height == 0) {
        return;
    }

    NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:height];
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:width];
    [heightConstraint setActive:TRUE];
    [widthConstraint setActive:TRUE];
}

//----------

// Usage :-
[button applyNavBarConstraints:33 height:33];

Güzel. Aslında benim de Objective-C versiyonuna ihtiyacım vardı. Btw, Xcode 9, film şeridindeki navbar öğelerini rastgele yeniden boyutlandırmaya devam ediyor. Değişikliklerimi iletmeden önce her seferinde iki kez kontrol etmem gerekiyor. Umarım bu yakında çözülür.
Karoly Nyisztor

sen benim kahramanımsın, çünkü eski projeyi hedef-c ile yeniden düzenlemem gerekiyor.
Marosdee Uma

18

Yeni barButtonItem, çerçevelerle uğraşmak yerine otomatik düzen kullanıyor.

Düğmeye eklediğiniz görüntü, düğme boyutunun kendisinden daha büyük. Bu nedenle düğmenin kendisi görüntünün boyutuna kadar uzatıldı. Düğmeye eklemeden önce gerekli düğme boyutuna uyması için resmi yeniden boyutlandırmanız gerekir.


14

Navbar öğelerindeki kısıtlamaları ayarlamak için küçük bir uzantı yazdım:

import UIKit

extension UIView {
    func applyNavBarConstraints(size: (width: CGFloat, height: CGFloat)) {
    let widthConstraint = self.widthAnchor.constraint(equalToConstant: size.width)
    let heightConstraint = self.heightAnchor.constraint(equalToConstant: size.height)
    heightConstraint.isActive = true
    widthConstraint.isActive = true
  }
}

// Usage
button.applyNavBarConstraints(size: (width: 33, height: 33))

İyi fikir! Bunu UIButtonçok iyi uyguladım.
Alessandro Ornano

12

Bunu aşağıdaki satırları kullanarak objektif olarak yaptım:

NSLayoutConstraint * widthConstraint = [customButton.widthAnchor constraintEqualToConstant:40];
NSLayoutConstraint * HeightConstraint =[customButton.heightAnchor constraintEqualToConstant:40];
[widthConstraint setActive:YES];
[HeightConstraint setActive:YES];

UIBarButtonItem* customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];
self.navigationItem.leftBarButtonItem = customBarButtonItem;

Teşekkürler Mutlu kodlama !!


7

Ben ne yaptım?

Uygulamamda, navigationBar'a rightBarButton öğesine profil resmi ekledim. iOS 11'den önce iyi çalışıyordu ve düzgün görüntüleniyordu ancak iOS 11'e güncellendiğinde darbe gibi davranışları değiştirin

görüntü açıklamasını buraya girin

Bu yüzden UIViewsağ düğme öğesini UIButtonekledim ve UIView? Aşağıdaki gibi

görüntü açıklamasını buraya girin

Ve yükseklik ve genişlik kısıtlamalarını ayarlıyorum UIButton.

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Ve benim sorunum çözüldü. UIViewArka plan rengini net renk olarak ayarlamayı unutmayın .

NOT: Düğmeniz sonra işe kontrol etmeyeceği Eğer UIView'syükseklik onun olabileceğini 0 burada değişmelidir yükseklik 0 -e doğru 44 ya da ne istiyorum. Ve ayrıca yapın clipToBound = true, Artık düğmenizin konumunu ayarlayabilirsiniz ve bu iyi çalışacaktır.


Bu çalışır, ancak bir görünüme eklediğinizde düğme çalışmayı durdurur. Herhangi bir ipucu?
eonist

@GitSync Görünümünüzün yüksekliğini kontrol edin, 0 olacak, bunu 44'e veya ne isterseniz değiştirin ve clipToBound = true yapın ve ardından düğmeyi ayarlayın.
iPatel

1
Vay. İşler!
Uzman

kapsayıcı görünümü gerekli mi? UIButton'ı doğrudan kullanamaz mıyım?
igrek

5

widthAnchor/ heightAnchorÖğesinin değiştirilmesi yalnızca iOS 11+ cihazlarda çalışır. İOS 10 cihazları için, çerçeveleri manuel olarak değiştirmenin klasik yoluna gitmeniz gerekir. Mesele şu ki, iki yaklaşımdan hiçbiri her iki sürüm için de işe yaramıyor, bu nedenle, aşağıdaki gibi çalışma zamanı sürümüne bağlı olarak kesinlikle programlı olarak geçiş yapmanız gerekir:

if #available(iOS 11.0, *)
{
   button.widthAnchor.constraint(equalToConstant: 32.0).isActive = true
   button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true
}else
{
   var frame = button.frame
   frame.size.width = 32.0
   frame.size.height = 32.0
   button.frame = frame
}

1
İOS 10 ipucu için teşekkürler! İOS 11 düzeltmesi çalışıyordu ancak iOS 10 için çözemedim.
Clifton Labrum

3

İOS 11, gezinme çubuğu için Otomatik Düzen'i kullansa da, geleneksel olarak çerçeve ayarlayarak çalışmasını sağlamak mümkündür. Kodum ios11 ve ios10 veya daha eski sürümler için çalışıyor:

func barItemWithView(view: UIView, rect: CGRect) -> UIBarButtonItem {
    let container = UIView(frame: rect)
    container.addSubview(view)
    view.frame = rect
    return UIBarButtonItem(customView: container)
}

ve çubuk öğesi şu şekilde oluşturulur:

    let btn = UIButton()
    btn.setImage(image.withRenderingMode(.alwaysTemplate), for: .normal)
    btn.tintColor = tint
    btn.imageView?.contentMode = .scaleAspectFit
    let barItem = barItemWithView(view: btn, rect: CGRect(x: 0, y: 0, width: 22, height: 22))
    return barItem

3

İOS 11.X çalıştıran kullanıcılar için programlı olarak kısıtlamalar koymak benim için çalıştı. Ancak, iOS 10.X çalıştıran kullanıcılar için çubuk düğmesi hala uzatılmıştı. Sanırım AppStore yorumcuları iOS 11.X kullanıyordu, bu yüzden sorunumu belirleyemedi, bu yüzden uygulamam satışa hazırlandı ve yüklendi ..

Çözümüm, başka bir yazılımda görüntümün boyutlarını 30x30 olarak değiştirmekti (önceki görüntü boyutu 120x120 idi).


1
İos10'daki gezinme çubuğu otomatik olarak yeniden boyutlandırıldığı ve ios11 otomatik düzenlendiği için, # mevcutsa (iOS 11, *) {}
Paulo Sigales

Yeni değişikliklerin üzerinden geçiyordum ve bu soruyu buldum, ancak bu cevabı geliştiricinin kullanması gerektiğini tahmin
ediyorum

Harika, basit cevap. Teşekkür ederim. Başka hiçbir şey çalışmıyordu ve beni deli ediyordu.
Brittany

0

Ayrıca, intrinsicContentSizecustomView olarak kullanmayı düşündüğüm herhangi bir özel UIView alt sınıfı için uygun bir boyut döndürmek için uygulayarak da başarılı oldum .


0

Bir çubuk düğmesi öğesi oluşturdum ve ardından onu gezinme çubuğuna ekledim.

    private var addItem: UIBarButtonItem = {
        let addImage = UIImage(named: "add")
        let addButton = UIButton(type: UIButton.ButtonType.custom)
        addButton.setBackgroundImage(addImage, for: UIControl.State())
        addButton.frame = CGRect(x: 0, y: 0, width: (addImage?.size.width)!, height: (addImage?.size.height)!)
        let addItem = UIBarButtonItem(customView: addButton)
        return addItem
    }()

 private var contactsItem: UIBarButtonItem = {
        let contactsImage = UIImage(named: "contacts")
        let contactsButton = UIButton(type: UIButton.ButtonType.custom)
        contactsButton.setBackgroundImage(contactsImage, for: UIControl.State())
        contactsButton.frame = CGRect(x: 0, y: 0, width: (contactsImage?.size.width)!, height: (contactsImage?.size.height)!)
        let contactsItem = UIBarButtonItem(customView: contactsButton)
        return contactsItem
    }()

ViewDidLoad ()

let spacerBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.fixedSpace, target: nil, action: nil)
        spacerBarButtonItem.width = 11
        navigationItem.rightBarButtonItems = [addItem, spacerBarButtonItem, contactsItem]

Burada 28x28 görüntüsüne sahibim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.