নেভিগেশন বার রাইটবারাইটেমে ইমেজ-বোতাম বাগ আইওএস 11


101

এই কোডটি আইওএস 10 এ ঠিক আছে। আমি আমার লেবেল এবং একটি চিত্র বোতাম যা ব্যবহারকারীর ফটো প্রোফাইল, বিজ্ঞপ্তি বৃত্ত .. ঠিক আছে। তবে এক্সকোড 9 আইওএস 11 সিমুলেটর চালানোর সময় আমি এটি প্রসারিত করে ফেলি। বোতামটির ফ্রেমটি 32x32 হতে হবে, যখন সিমটি পরীক্ষা করা হয় এবং ভিউটি পাওয়া যায় এবং এক্সকোডকে ভিউটি বর্ণনা করতে বলি আমি 170x32 হিসাবে আউটপুট পাব বা এর মতোই কিছু করব।

আমার কোড heres।

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

    }

এখানে চিত্র বর্ণনা লিখুন


আপনি কি নেভিগেশন বারে স্ট্যাক ভিউ ব্যবহার করেছেন?
ভ্লাদ খাম্বির

@ ভি.খাম্বির ন্যাপ ...: /
গঞ্জালেজ

এই বাগ রিপোর্ট কোথাও আছে?
এডু

আইওএস 11 ন্যাভিগেশন আইটেমগুলি বিন্যাস করতে অটোলআউট ব্যবহার করে। আপনি যদি UIButtonঅভ্যন্তরীণ স্থানান্তর UIBarButtonItemকরতে চান তবেbutton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
onwayway133

উত্তর:


188

কারণ

সমস্যাটি দেখা দেয় কারণ আইওএস 11 থেকে UIBarButtonItemফ্রেম নিয়ে কাজ করার পরিবর্তে অটোলেআউট ব্যবহার করে।

সমাধান

আপনি যদি এক্সকোড 9 ব্যবহার করেন তবে এই চিত্র-বোতামটির জন্য আপনার প্রস্থের সীমাবদ্ধতা যুক্ত করা উচিত।

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

পুনশ্চ

buttonনা UIBarButtonItem, এটি UIButtonভিতরে আছে UIBarButtonItem। আপনার বাধা সেট করা উচিত নয় UIBarButtonItemএটির ভিতরে থাকা উপাদানগুলির জন্য।


3
@ ভি.খাম্বির এখন আমি এই সমস্যাটি পাচ্ছি। তবে এই একই সমাধানটি এক্সকোড 9 সহ, এবং আমি যদি আইওএস 1 ডিভাইসে চালিত করি তবে এটি ঠিক আছে..কিন্তু আমি যদি আইওএস 10 সংস্করণ ডিভাইসে চালনা করি তবে আমার বার বোতামের চিত্রগুলি মোটেই প্রদর্শিত হবে না। আমি কীভাবে এর জন্য সমস্ত সংস্করণ ঠিক করতে পারি। আমি আইওএস 11, আইওএস 10 উভয়ই ডিভাইসটি পরীক্ষা করেছি। কেবল আইওএস 1 সংস্করণে ভাল দেখাচ্ছে। আইওএস 10 এ, চিত্রটি মোটেও প্রদর্শিত হচ্ছে না
ডেভিড

@ স্পাইকা, এটি উভয় আইওএস সংস্করণে কাজ করা উচিত, সম্ভবত আপনি ভুল সীমাবদ্ধতা সেট করেছেন।
ভ্লাদ খাম্বির

@ ভি.খামবীরের টাইপ 'ইউআইবারবারটন আইটেম'-এর কোনও সদস্যের এক্সকোড 9-তে কোনও' প্রশস্ততা অ্যাঙ্কর 'নেই যদি # উপলব্ধ (আইওএস 11.0, *) শর্তযুক্ত?
রায়ান ব্রোডি

1
@jped আপনি কি এর জন্য কোনও সমাধান খুঁজে পেয়েছেন? এটি Xcode 9
আইআরএস

1
গ্রেট। এই ব্রেকিং পরিবর্তনগুলি ভালবাসবে। অ্যাপল কোনও পৃষ্ঠায় এই ধরণের পরিবর্তনের একটি তালিকা নথিভুক্ত করেছে বা কোথাও নোট প্রকাশ করেছে?
গোনিলে

53

অবদানের জন্য সবাইকে ধন্যবাদ! তোমরা বলছ ঠিক! xcode9 ios11 এর জন্য আপনাকে একটি সীমাবদ্ধতা রাখা দরকার।

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

1
এটি আমার পক্ষেও কাজ করেছিল, তবে যে কেউ আগে কখনও কখনও আইওএস 11 এর জন্য কেন এটি প্রয়োজনীয় তা ব্যাখ্যা করতে পারে?
স্টোনডাউগ

9
ইউআইএনএভিগেশনবার এখন অটো লেআউট
ম্যানগারেলাহন

2
আমার মতো একই ভুল করবেন না: আমি বন্ধ করে দিয়েছি translatesAutoresizingMaskIntoConstraintsএবং পরে জানতে পেরেছিলাম যে আইওএস 9 টি সম্পূর্ণভাবে ভেঙে গেছে (তবে আইওএস 10 এবং 11 তে ভাল লাগছিল)
xaphod

2
Value of type 'UIBarButtonItem' has no member 'widthAnchor'এক্সকোড 9 এ if #available(iOS 11.0, *)শর্তাধীন?
রায়ান ব্রোডি

@ lorenzo-gonzalez আপনি কীভাবে এটি গোল করেছিলেন? আমি এই উপর আটকে আছি।
আলেসান্দ্রো লুসারিনি

18

উদ্দেশ্য সি কোড এখন অপ্রচলিত। তবে যে ব্যবহারকারীর জন্য আইওএস ১১-তে অবজেক্টিভ সি প্রকল্পগুলি নির্মাণ বা রক্ষণাবেক্ষণ করতে হবে তার পক্ষে সুইফ্ট (করোলি নিস্তজর উত্তর) থেকে ওজেক্টিভ সি সহায়ক অনুবাদ রয়েছে।

//  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];

কুল। আসলে, আমার ওপজেক্টিভ-সি সংস্করণও দরকার ছিল। বিটিডব্লিউ, এক্সকোড 9 স্টোরিবোর্ডে নাভবার আইটেমগুলি এলোমেলোভাবে আকার পরিবর্তন করে। আমার পরিবর্তনগুলি ঠেকানোর আগে আমাকে প্রতিবার ডাবল-চেক করতে হবে। আশা করি এটি অবশেষে শীঘ্রই স্থির হয়ে উঠবে।
করোলি নিস্ত্তর

আপনি আমার নায়ক, কারণ আমার উদ্দেশ্য-সি দিয়ে পুরানো প্রকল্পটি রিফ্যাক্টর করা দরকার।
মারোসদী উমা

18

ভাল, নতুন barButtonItemফ্রেমগুলি ব্যবহার করার পরিবর্তে অটোলেআউট ব্যবহার করে।

আপনি বাটনটিতে যে চিত্রটি যুক্ত করছেন সেটি বোতামের আকারের চেয়ে বড়। এ কারণেই বোতামটি নিজেই চিত্রের আকারে প্রসারিত হয়েছিল। আপনাকে বোতামটি যুক্ত করার আগে প্রয়োজনীয় বোতামের আকার মেলাতে চিত্রটি পুনরায় আকার দিতে হবে।


14

আমি নভবার আইটেমগুলিতে সীমাবদ্ধতা স্থাপনের জন্য একটি ছোট এক্সটেনশন লিখেছিলাম:

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))

ভালো বুদ্ধি! এটি একটি UIButtonখুব ভাল কাজ প্রয়োগ ।
আলেসান্দ্রো ওর্নানো

12

আমি নিম্নলিখিত লাইনগুলি ব্যবহার করে উদ্দেশ্যগতভাবে এটি করেছি:

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;

ধন্যবাদ শুভ কোডিং !!


7

আমি কি করেছিলাম?

আমার অ্যাপ্লিকেশনে, আমি ডানবার্ট বাটন আইটেমে নেভিগেশনবারে প্রোফাইল চিত্র যুক্ত করেছি। আইওএস 11 এর আগে এটি ভাল কাজ করছিল এবং সঠিকভাবে প্রদর্শিত হয়েছিল তবে আইওএস 11 এ আপডেট হওয়ার পরে আঘাতের মতো আচরণ পরিবর্তন করুন

এখানে চিত্র বর্ণনা লিখুন

তাই আমি UIViewডান বোতাম আইটেম যোগ এবং UIButtonসাবউভিউ হিসাবে সেট UIView? নীচের মত,

এখানে চিত্র বর্ণনা লিখুন

এবং আমি উচ্চতা এবং প্রস্থ সীমাবদ্ধতা সেট UIButton

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

এবং আমার সমস্যা সমাধান করা হয়। সাফ রঙ UIViewহিসাবে পটভূমি রঙ সেট করতে ভুলবেন না ।

দ্রষ্টব্য: যদি আপনার বোতামটি কাজ না করে তবে আপনার UIView'sউচ্চতা 0 হতে পারে তা এখানে পরীক্ষা করুন আপনার উচ্চতা 0 থেকে 44 বা যা আপনি চান পরিবর্তন করা উচিত । এবং এটিও করুন clipToBound = true, এখন আপনি নিজের বোতামের অবস্থান সেট করতে পারেন এবং এটি ভালভাবে কাজ করবে।


এটি কাজ করে, তবে আপনি যখন কোনও দৃশ্যে এটি যুক্ত করেন তখন বোতামটি কাজ বন্ধ করে দেয়। কোন টিপস?
ইনিস্ট

@ গিটসাইক আপনার দর্শনীয়তার উচ্চতা চেক করুন এটি 0 থেকে 44 এ পরিণত হবে বা আপনি যা চান তাই করুন এবং ক্লিপটোবাউন্ড = সত্য এবং তারপরে বোতামটি সেট করুন।
আইপ্যাটেল

1
কি দারুন. কাজ করে! প্রো টিপ: .png এর পরিবর্তে .pdf সম্পদগুলি ব্যবহার করুন
ইওনিস্ট

ধারক ভিউ প্রয়োজনীয়? আমি কি সরাসরি ইউআইবাটন ব্যবহার করতে পারি না?
igrek

5

widthAnchor/ পরিবর্তন করা heightAnchorকেবল আইওএস 11+ ডিভাইসগুলিতে কাজ করবে। আইওএস 10 ডিভাইসের জন্য আপনাকে ফ্রেমগুলি ম্যানুয়ালি পরিবর্তনের শাস্ত্রীয় পথে যেতে হবে। জিনিসটি হ'ল দুটি পদ্ধতির কোনওটিই উভয় সংস্করণের জন্য কাজ করে না, তাই আপনার নিচের মত রানটাইম সংস্করণের উপর নির্ভর করে প্রোগ্রামগতভাবে বিকল্প হতে হবে:

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
আইওএস 10 টিপটির জন্য ধন্যবাদ! আমি আইওএস 11 ফিক্স কাজ করেছিলাম কিন্তু আইওএস 10 এর জন্য এটি বের করতে পারিনি
ক্লিফটন ল্যাব্রাম

3

আইওএস 11 ন্যাভিগেশন বারের জন্য অটোলেআউট ব্যবহার করলেও এটি traditionতিহ্যগতভাবে ফ্রেমগুলি সেট করে কাজ করা সম্ভব। এখানে আমার কোডগুলি আইওএস 11 এবং আইওএস 10 বা তার বেশি বয়সীদের জন্য কাজ করছে:

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

এবং এখানে কীভাবে বার আইটেমটি রচনা করা হয়েছে:

    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

আইওএস ১১ এক্স এক্স চালিত ব্যবহারকারীদের জন্য প্রোগ্রামিংয়ে সীমাবদ্ধতা প্রোগ্রামের জন্য কাজ করেছিল। তবে, আইওএস ১০ এক্স চলমান ব্যবহারকারীদের জন্য বারের বোতামটি এখনও প্রসারিত করা হয়েছিল। আমি অনুমান করি যে অ্যাপস্টোর পর্যালোচকগুলি আইওএস ১১ এক্স চালাচ্ছে তাই এইভাবে আমার সমস্যাটি সনাক্ত করতে পারেনি তাই আমার অ্যাপ্লিকেশন বিক্রির জন্য প্রস্তুত হয়ে আপলোড হয়েছে ..

আমার সমাধানটি ছিল কেবলমাত্র অন্য সফ্টওয়্যারটিতে আমার চিত্রটির মাত্রা 30x30 এ পরিবর্তন করা (পূর্ববর্তী চিত্রের মাত্রা ছিল 120x120)।


1
কারণ আইওএস 10-তে নেভিগেশনবারটি স্বয়ংক্রিয়করণ করছে এবং আইওএস 11 স্বয়ংক্রিয়ভাবে চলছে, আপনার যদি # উপলভ্য থাকে তবে (আইওএস 11, *) {}
পাওলো সিগালেস

আমি নতুন পরিবর্তনগুলির মধ্য দিয়ে যাচ্ছিলাম এবং আমি এই প্রশ্নটি পেয়েছি, তবে এই উত্তরটি আমার ধারণা বিকাশকারীকে ব্যবহার করা উচিত
শোভাকর তিওয়ারি

দুর্দান্ত, সহজ উত্তর। ধন্যবাদ. অন্য কিছু কাজ করছিল না এবং এটি আমাকে পাগল করছে।
ব্রিটানি

0

আমি intrinsicContentSizeকাস্টমভিউ হিসাবে ব্যবহার করার ইচ্ছা করি এমন যে কোনও কাস্টম ইউআইভিউ সাবক্লাসের জন্য উপযুক্ত আকার ফিরিয়ে আনার মাধ্যমে আমি সাফল্যও পেয়েছি।


0

আমি একটি বার বোতাম আইটেম তৈরি করেছি এবং তারপরে এটিকে নেভিগেশনবারে যুক্ত করেছি।

    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
    }()

দ্য ডিডলয়েডে ()

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

এখানে আমি 28x28 এর চিত্র পাচ্ছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.